連接ios
讓你統計\(0\) ~ \(10^n-1\) 中長度爲 \(len\) 的連續塊的個數c++
考慮長度爲 \(len\) 的連續塊的位置,有兩種狀況spa
xxxx........
以及 .......xxxx
這兩種....xxxx.....
對於第①種狀況,開頭或結尾的連續塊有 \(10\) 種可能,而和這個連續塊緊接着的一個單元(注意是單元而不是塊),有 \(9\) 種可能,由於不能和這個塊相同。翻譯
而後剩餘 \(n-len-1\) 個單元隨意放, 有 \(10^{n-len-1}\) 種可能。code
有頭尾 \(2\) 種,因此第①種狀況對應了 \(2*10*9*10^{n-len-1}\)ci
第②種狀況,和這個連續塊(10種可能),左右相鄰的兩個單元只有 \(9\) 種可能,而後剩餘 \(n-len-2\) 個位置隨意放 \(10^{n-len-2}\),而後這個連續塊在中間的話有get
\(n-len-1\) 种放法(除了頭尾),因此第二種狀況就對應了 \(10*9*9*10^{n-len-2}*(n-len-1)\) 種方案。it
注意 \(len=n\) 時特殊處理,答案爲固定的 \(10\)io
#include <bits/stdc++.h> #define LL long long using namespace std; const LL MOD = 998244353; const int N = 2e5; int n; LL _pow[N + 10]; int main(){ // freopen("C://1.cppSourceProgram//rush.txt","r",stdin); ios::sync_with_stdio(0),cin.tie(0); //step5 算10^i _pow[0] = 1; for (int i = 1;i <= N; i++){ _pow[i] = _pow[i-1]*10%MOD; } cin >> n; //step1 ite i for (int i = 1;i < n; i++){ LL ans = 0; //step2 在頭尾的狀況 ans = (ans + 10*9*2*_pow[n-i-1]%MOD)%MOD; //step3 在中間的狀況 ans = (ans + 10*9*9*_pow[n-i-2]%MOD*(n-i-1)%MOD)%MOD; cout << ans <<" "; } //step4 len=n cout << 10 << endl; return 0; }