1. 程式人生 > 實用技巧 >洛谷P6553題解

洛谷P6553題解

這題要求出三個量:

1.1的個數。

2.整個字串每個數位的總和。

3.整個字串每個數位的乘積。

我們可以先把各個數字都統計起來;對於第一問,直接輸出結果;對於第二問,只要把各個數字乘上它出現的次數就可以了;對於第三問,一個一個乘過去要超時,我們可以預處理一個數的1到1000000次方。

每次修改時,要把原陣列和統計結果一起修改。

程式碼:

 1 #include<bits/stdc++.h>
 2 #define mod 99824353
 3 #define ll long long
 4 using namespace std;
 5 string s;
 6 ll a[1005000],m,sum[10
],q4[1005000],q5[1005000]; 7 ll l,r; 8 string ss; 9 int main(){ 10 cin>>s; 11 for(int i=0;i<s.size();++i){ 12 a[i+1]=s[i]-'0'; 13 ++sum[a[i+1]];//統計 14 } 15 q4[0]=q5[0]=1; 16 for(int i=1;i<=1000000;++i){ 17 q4[i]=q4[i-1]*4%mod; 18 q5[i]=q5[i-1]*5%mod; 19 }//預處理1至1000000次方
20 scanf("%lld",&m); 21 for(int i=1;i<=m;++i){ 22 scanf("%lld%lld",&l,&r); 23 cin>>ss; 24 for(int j=l;j<=r;++j){ 25 int num=ss[j-l]-'0'; 26 --sum[a[j]]; 27 ++sum[num]; 28 a[j]=num; 29 }//修改 30 printf("
%lld %lld %lld\n",sum[1]%mod,(sum[1]+sum[4]*4+sum[5]*5)%mod,q4[sum[4]]*q5[sum[5]]%mod);//輸出 31 } 32 return 0; 33 }