Educational Codeforces Round 84 E. Count The Blocks

传送门: 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 }

猜你喜欢

转载自www.cnblogs.com/lilibuxiangtle/p/12556481.html