Count The Blocks
思路:題目可以理解為求長度為x(每個字符相同)的塊有多少個,我們可以把這些字符合并成一個塊,假設這個塊的長度為m,這樣總長度n = n - m + 1.這個塊兩邊不能有相同的字符,那么分情況討論:
假設n = 4, x = 2,那么 n = 4 - 2 + 1 = 3.
①塊在兩邊:
10 * 9 * 10 * 2(最左邊和最右邊)
②塊在中間
9 * 10 * 9 * (n - 2)(除去兩邊的位置)
這樣我們可以推出公式可以:
①情況: 9 * 10^(n - 1) * 2
②情況: 9 * 9 * 10^(n - 2) * (n - 2)
長度為x的塊情況下,n為對應的剩余長度,則cnt = ① + ②,這樣我們可以先預處理出10^(0~n)的答案再去求x = 1~n的個數,
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <functional> 5 #include <set> 6 #include <vector> 7 #include <queue> 8 #include <cstring> 9 10 using namespace std; 11 12 #define ll long long 13 #define pb push_back 14 #define fi first 15 #define se second 16 17 const int N = 2e5 + 10; 18 const int INF = 1e9; 19 const int MAX_DIS = 2e6; 20 const ll MOD = 998244353; 21 22 int _case = 0; 23 24 void solve(){ 25 int n; 26 cin >> n; 27 vector<ll > a(n + 1); 28 a[0] = 1; 29 for(int i = 1; i <= n; ++i) a[i] = (a[i - 1] * 10) % MOD; 30 vector<ll > ans(n + 1); 31 ans[1] = 10; ans[2] = 180; 32 for(int i = 3; i <= n; ++i) 33 ans[i] = 34 ((a[i - 2] * 81 * (i - 2)) % MOD + (a[i - 1] * 9 * 2) % MOD ) % MOD; 35 36 for(int i = n; i >= 1; --i) cout << ans[i] << " "; 37 cout << endl; 38 } 39 40 int main(){ 41 42 ios::sync_with_stdio(false); 43 cin.tie(0); 44 cout.tie(0); 45 solve(); 46 47 return 0; 48 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55349.html
標籤:其他
