【Codeforces 1327E】Count The Blocks

題目連接

連接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;
}
相關文章
相關標籤/搜索