傳送門: 1327- E. Count The Blocks
題意:給你一個整數n,求10^n內(每個數有前導零)長度為1到n的塊分別有多少個。塊的含義是連續相同數字的長度。
題解:從n=1開始枚舉,ans數組記錄每個長度的塊的個數。當前的ans[n]的值就是下一個n++后的ans[n]的值,這樣每次只用算長度為1的塊有多少個就好了。為了方便,將ans數組倒過來記錄。長度為1的塊實際上就是總數字個數減去長度為2~n所含有的數字個數。比如n=1時,長度為1的個數有10,當n=2時,長度為1的個數就是10^2*2-10*2=180,n=3時,長度為1的個數就是10^3*3-180*2-10*3=2610;
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 5 const ll mod=998244353; 6 ll ans[200100],p[200100]; 7 8 ll quick(ll a,ll b) 9 { 10 ll res=1; 11 a=a%mod; 12 while(b){ 13 if(b&1) res=(res*a)%mod; 14 a=(a*a)%mod; 15 b>>=1; 16 } 17 return res; 18 } 19 20 int main() 21 { 22 ios::sync_with_stdio(false); 23 cin.tie(0); 24 cout.tie(0); 25 ll n; 26 cin>>n; 27 ans[1]=10; 28 p[1]=10; 29 ll sum=p[1]+ans[1]; 30 for(ll i=2;i<=n;i++){ 31 ans[i]=quick(10,i)*i%mod-sum+mod; 32 ans[i]%=mod; 33 p[i]=p[i-1]+ans[i]; 34 p[i]%=mod; 35 sum+=p[i]+ans[i]; 36 sum%=mod; 37 } 38 for(int i=n;i>=1;i--) 39 cout<<ans[i]<<' '; 40 return 0; 41 }