#include<bits/stdc++.h> using namespace std; int n,q,trans[1001],ile[3]; vector<int>tenieda; char ciag[200001]; long long mod=1000000007,pot2[200001],odwmod3=333333336,dode=6000000000; long long silnia[200001]; int cznaparz[2][2]; long long ileb[200001][3]; long long sp(long long podst,long long wyk) { long long ret=1; while(wyk) { if(wyk&1) ret=(ret*podst)%mod; podst=(podst*podst)%mod; wyk>>=1; } return ret; } long long snwe(long long a,long long b) { return (((silnia[a]*sp(silnia[b],mod-2))%mod)*sp(silnia[a-b],mod-2))%mod; } long long licz_wyn() { long long uzysk=(6000000+ile[1]-ile[0]+ile[2])%6; if(uzysk%2!=0) return pot2[ile[2]]; // cout<<ile[0]<<" "<<ile[1]<<" "<<ile[2]<<endl; // cout<<uzysk<<endl; long long ret=ileb[ile[2]][uzysk/2]; //cout<<ret<<endl; if(n&1) { if(ile[2]==n) ret+=2; else if((cznaparz[0][0]==0&&cznaparz[1][1]==0)||(cznaparz[0][1]==0&&cznaparz[1][0]==0)) ++ret; } ret%=mod; //cout<<ret<<endl; return (2*mod+pot2[ile[2]]-ret)%mod; } int main() { trans['C']=0; trans['Z']=1; trans['N']=2; pot2[0]=1; silnia[0]=1; ileb[0][0]=1; for(int i=1;i<=200000;++i) { pot2[i]=(pot2[i-1]<<1)%mod; for(int j=0;j<3;++j) ileb[i][j]=(ileb[i-1][j]+ileb[i-1][(j+2)%3])%mod; } scanf("%d%d",&n,&q); if(n&1) ile[1]+=3; for(int i=n/2-(n&1);i>=0;i-=3) tenieda.push_back(i); getchar(); for(int i=1;i<=n;++i) { ciag[i]=trans[getchar()]; ++ile[ciag[i]]; if(ciag[i]!=2) cznaparz[ciag[i]][i%2]++; } if(n==1) { if(ciag[1]==2) printf("2\n"); else printf("1\n"); } else printf("%lld\n",licz_wyn()); int a; char b; while(q) { --q; scanf("%d %c",&a,&b); b=trans[b]; if(ciag[a]!=2) cznaparz[ciag[a]][a%2]--; --ile[ciag[a]]; ++ile[b]; ciag[a]=b; if(b!=2) cznaparz[b][a%2]++; if(n==1) { if(b==2) printf("2\n"); else printf("1\n"); } else printf("%lld\n",licz_wyn()); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include<bits/stdc++.h> using namespace std; int n,q,trans[1001],ile[3]; vector<int>tenieda; char ciag[200001]; long long mod=1000000007,pot2[200001],odwmod3=333333336,dode=6000000000; long long silnia[200001]; int cznaparz[2][2]; long long ileb[200001][3]; long long sp(long long podst,long long wyk) { long long ret=1; while(wyk) { if(wyk&1) ret=(ret*podst)%mod; podst=(podst*podst)%mod; wyk>>=1; } return ret; } long long snwe(long long a,long long b) { return (((silnia[a]*sp(silnia[b],mod-2))%mod)*sp(silnia[a-b],mod-2))%mod; } long long licz_wyn() { long long uzysk=(6000000+ile[1]-ile[0]+ile[2])%6; if(uzysk%2!=0) return pot2[ile[2]]; // cout<<ile[0]<<" "<<ile[1]<<" "<<ile[2]<<endl; // cout<<uzysk<<endl; long long ret=ileb[ile[2]][uzysk/2]; //cout<<ret<<endl; if(n&1) { if(ile[2]==n) ret+=2; else if((cznaparz[0][0]==0&&cznaparz[1][1]==0)||(cznaparz[0][1]==0&&cznaparz[1][0]==0)) ++ret; } ret%=mod; //cout<<ret<<endl; return (2*mod+pot2[ile[2]]-ret)%mod; } int main() { trans['C']=0; trans['Z']=1; trans['N']=2; pot2[0]=1; silnia[0]=1; ileb[0][0]=1; for(int i=1;i<=200000;++i) { pot2[i]=(pot2[i-1]<<1)%mod; for(int j=0;j<3;++j) ileb[i][j]=(ileb[i-1][j]+ileb[i-1][(j+2)%3])%mod; } scanf("%d%d",&n,&q); if(n&1) ile[1]+=3; for(int i=n/2-(n&1);i>=0;i-=3) tenieda.push_back(i); getchar(); for(int i=1;i<=n;++i) { ciag[i]=trans[getchar()]; ++ile[ciag[i]]; if(ciag[i]!=2) cznaparz[ciag[i]][i%2]++; } if(n==1) { if(ciag[1]==2) printf("2\n"); else printf("1\n"); } else printf("%lld\n",licz_wyn()); int a; char b; while(q) { --q; scanf("%d %c",&a,&b); b=trans[b]; if(ciag[a]!=2) cznaparz[ciag[a]][a%2]--; --ile[ciag[a]]; ++ile[b]; ciag[a]=b; if(b!=2) cznaparz[b][a%2]++; if(n==1) { if(b==2) printf("2\n"); else printf("1\n"); } else printf("%lld\n",licz_wyn()); } return 0; } |