#include <bits/stdc++.h> using namespace std; typedef long long ll; #ifdef LOCAL #define debug(...) __VA_ARGS__ #else #define debug(...) {} #endif const ll mod = 1e9+7; ll fastpow(ll a, ll b){ ll w = 1; while (b){ if (b%2) w = (w*a)%mod; a = (a*a)%mod; b /= 2; } return w%mod; } ll dod[2]; ll tab[6][3]; ll ilesposobow(ll n, ll k, ll reszta, ll dl){ reszta = ((reszta-k)%3+3)%3; //cout<<reszta<<"\n"; //cout<<fastpow(2,n)<<"\n"; ll val; if (n%2) val = ((fastpow(2,n)+1)*fastpow(3,mod-2))%mod; else val = ((fastpow(2,n)+2)*fastpow(3,mod-2))%mod; val += tab[n%6][reszta]; //cout<<val<<"\n"; //cout<<n<<"\n"; ll wy = (fastpow(2,n)-val+mod)%mod; if (dl%2){ if (dod[0] == dl) wy--; if (dod[1] == dl) wy--; } return (wy+mod)%mod; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); ll i; //Dziwna tablica tab[0][1] = tab[0][2] = -1; tab[1][2] = -1; tab[2][0] = tab[2][2] = -1; tab[3][0] = -1; tab[4][0] = tab[4][1] = -1; tab[5][1] = -1; // ll n,m; cin>>n>>m; string s; cin>>s; if (n == 1){ if (s[0] == 'N') cout<<2<<"\n"; else cout<<1<<"\n"; while (m--){ ll pos; char akt; cin>>pos>>akt; s[0] = akt; if (s[0] == 'N') cout<<2<<"\n"; else cout<<1<<"\n"; } return 0; } ll ilen = 0; ll ilez = 0; for (char c : s){ if (c == 'N') ilen++; if (c == 'Z') ilez++; } for (i = 0; i < (ll)s.size(); i++){ if (s[i] != 'C'){ dod[i%2]++; } if (s[i] != 'Z'){ dod[(i+1)%2]++; } } cout<<ilesposobow(ilen,ilez,(3-n%3)%3,n)<<"\n"; while (m--){ ll pos; char c; cin>>pos>>c; if (s[pos-1] == 'N') ilen--; if (s[pos-1] == 'Z') ilez--; if (s[pos-1] != 'C') dod[(pos-1)%2]--; if (s[pos-1] != 'Z') dod[pos%2]--; if (c == 'N') ilen++; if (c == 'Z') ilez++; if (c != 'C') dod[(pos-1)%2]++; if (c != 'Z') dod[pos%2]++; s[pos-1] = c; cout<<ilesposobow(ilen,ilez,(3-n%3)%3,n)<<"\n"; } 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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #ifdef LOCAL #define debug(...) __VA_ARGS__ #else #define debug(...) {} #endif const ll mod = 1e9+7; ll fastpow(ll a, ll b){ ll w = 1; while (b){ if (b%2) w = (w*a)%mod; a = (a*a)%mod; b /= 2; } return w%mod; } ll dod[2]; ll tab[6][3]; ll ilesposobow(ll n, ll k, ll reszta, ll dl){ reszta = ((reszta-k)%3+3)%3; //cout<<reszta<<"\n"; //cout<<fastpow(2,n)<<"\n"; ll val; if (n%2) val = ((fastpow(2,n)+1)*fastpow(3,mod-2))%mod; else val = ((fastpow(2,n)+2)*fastpow(3,mod-2))%mod; val += tab[n%6][reszta]; //cout<<val<<"\n"; //cout<<n<<"\n"; ll wy = (fastpow(2,n)-val+mod)%mod; if (dl%2){ if (dod[0] == dl) wy--; if (dod[1] == dl) wy--; } return (wy+mod)%mod; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); ll i; //Dziwna tablica tab[0][1] = tab[0][2] = -1; tab[1][2] = -1; tab[2][0] = tab[2][2] = -1; tab[3][0] = -1; tab[4][0] = tab[4][1] = -1; tab[5][1] = -1; // ll n,m; cin>>n>>m; string s; cin>>s; if (n == 1){ if (s[0] == 'N') cout<<2<<"\n"; else cout<<1<<"\n"; while (m--){ ll pos; char akt; cin>>pos>>akt; s[0] = akt; if (s[0] == 'N') cout<<2<<"\n"; else cout<<1<<"\n"; } return 0; } ll ilen = 0; ll ilez = 0; for (char c : s){ if (c == 'N') ilen++; if (c == 'Z') ilez++; } for (i = 0; i < (ll)s.size(); i++){ if (s[i] != 'C'){ dod[i%2]++; } if (s[i] != 'Z'){ dod[(i+1)%2]++; } } cout<<ilesposobow(ilen,ilez,(3-n%3)%3,n)<<"\n"; while (m--){ ll pos; char c; cin>>pos>>c; if (s[pos-1] == 'N') ilen--; if (s[pos-1] == 'Z') ilez--; if (s[pos-1] != 'C') dod[(pos-1)%2]--; if (s[pos-1] != 'Z') dod[pos%2]--; if (c == 'N') ilen++; if (c == 'Z') ilez++; if (c != 'C') dod[(pos-1)%2]++; if (c != 'Z') dod[pos%2]++; s[pos-1] = c; cout<<ilesposobow(ilen,ilez,(3-n%3)%3,n)<<"\n"; } return 0; } |