Codeforces 1327E - Count The Blocks (dp)

Description

思路

当总长为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] << " ";
 
}
posted @ 2020-04-29 22:46  limil  阅读(129)  评论(0编辑  收藏  举报