Codeforces 1327E - Count The Blocks (dp)
思路
当总长为n,block长度为k时,把k看成一个整体,那么求k的个数相当于求总长为n-k+1时,block长度为1的个数。
假设dp[n]代表的是总长为n中block长度为1的个数。我们要求的就是这个dp 1到n的值。
求block长度为1的个数,就是把总的情况数,减去长度为2, 3 ... n的个数。而这里的长度为2, 3, ...的个数,就是2 * dp[n-1], 3 * dp[n - 2]...。
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
typedef long long ll;
#define endl '\n'
#define inf 0x3f3f3f3f
const int M = 998244353;
ll dp[N];
int main() {
ios::sync_with_stdio(false);
int n;
cin >> n;
dp[1] = 10;
dp[2] = 180;
if(n > 2) {
ll tot = dp[1] * 2 + dp[2];
ll sum = dp[1] + dp[2];
ll all = 100;
for(int i = 3; i <= n; i++) {
all = (all * 10) % M;
tot = (tot + sum) % M;
dp[i] = ((all * i - tot) % M + M) % M;
sum = (sum + dp[i]) % M;
tot = (tot + dp[i]) % M;
}
}
for(int i = n; i >= 1; i--) cout << dp[i] << " ";
}