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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM