#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define f first #define s second #define MAX 20000009 #define MOD 1000000007 #define MOD1 1000696969 #define INF 1000000000000000 #pragma GCC optimize ("O3") typedef uint_fast64_t lld; using namespace std; lld n,maxin=MAX,przez,przez1; lld xory; lld xory1; char c; lld dpoty=1,dpoty1=1,odw,odw1; lld poty=1,poty1=1,razy1,razy; lld hasz,hasz1,odwhasz,odwhasz1; lld pot(lld co,lld dok){ if(dok==0){ return 1; }else if(dok%2==0){ lld temp=pot(co,dok/2); return (temp*temp)%MOD; }else{ return (co*pot(co,dok-1))%MOD; } } lld pot1(lld co,lld dok){ if(dok==0){ return 1; }else if(dok%2==0){ lld temp=pot1(co,dok/2); return (temp*temp)%MOD1; }else{ return (co*pot1(co,dok-1))%MOD1; } } int main() { for(int i=1;i<=MAX;++i){ dpoty*=31; dpoty%=MOD; dpoty1*=31; dpoty1%=MOD1; } scanf("%lld",&n); odw=pot(31,MOD-2); odw1=pot1(31,MOD1-2);//cout<<dpoty1; n=0; scanf("%c",&c); c='a'; do{ //cout<<"X"; c=getchar_unlocked(); //cout<<c; if(!(c>='a'))break; ++n; //cout<<"X"<<(c-'a'+1)<<endl; lld st=(c-'a'+1); hasz+=st*poty; hasz%=MOD; hasz1+=st*poty1; hasz1%=MOD1; poty*=31; poty1*=31; poty%=MOD; poty1%=MOD1; odwhasz+=st*dpoty; odwhasz%=MOD; odwhasz1+=st*dpoty1; odwhasz1%=MOD1; //cout<<odwhasz1<<endl; dpoty*=odw; dpoty%=MOD; dpoty1*=odw1; dpoty1%=MOD1; }while(true); przez=pot(31,MAX-n+1); przez1=pot1(31,MAX-n+1); przez=pot(przez,MOD-2); przez1=pot1(przez1,MOD1-2); odwhasz*=przez; odwhasz%=MOD; odwhasz1*=przez1; odwhasz1%=MOD1; //cout<<odwhasz1; if(hasz==odwhasz&&hasz1==odwhasz1){ printf("TAK"); }else{ printf("NIE"); } 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 108 109 110 111 112 | #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define f first #define s second #define MAX 20000009 #define MOD 1000000007 #define MOD1 1000696969 #define INF 1000000000000000 #pragma GCC optimize ("O3") typedef uint_fast64_t lld; using namespace std; lld n,maxin=MAX,przez,przez1; lld xory; lld xory1; char c; lld dpoty=1,dpoty1=1,odw,odw1; lld poty=1,poty1=1,razy1,razy; lld hasz,hasz1,odwhasz,odwhasz1; lld pot(lld co,lld dok){ if(dok==0){ return 1; }else if(dok%2==0){ lld temp=pot(co,dok/2); return (temp*temp)%MOD; }else{ return (co*pot(co,dok-1))%MOD; } } lld pot1(lld co,lld dok){ if(dok==0){ return 1; }else if(dok%2==0){ lld temp=pot1(co,dok/2); return (temp*temp)%MOD1; }else{ return (co*pot1(co,dok-1))%MOD1; } } int main() { for(int i=1;i<=MAX;++i){ dpoty*=31; dpoty%=MOD; dpoty1*=31; dpoty1%=MOD1; } scanf("%lld",&n); odw=pot(31,MOD-2); odw1=pot1(31,MOD1-2);//cout<<dpoty1; n=0; scanf("%c",&c); c='a'; do{ //cout<<"X"; c=getchar_unlocked(); //cout<<c; if(!(c>='a'))break; ++n; //cout<<"X"<<(c-'a'+1)<<endl; lld st=(c-'a'+1); hasz+=st*poty; hasz%=MOD; hasz1+=st*poty1; hasz1%=MOD1; poty*=31; poty1*=31; poty%=MOD; poty1%=MOD1; odwhasz+=st*dpoty; odwhasz%=MOD; odwhasz1+=st*dpoty1; odwhasz1%=MOD1; //cout<<odwhasz1<<endl; dpoty*=odw; dpoty%=MOD; dpoty1*=odw1; dpoty1%=MOD1; }while(true); przez=pot(31,MAX-n+1); przez1=pot1(31,MAX-n+1); przez=pot(przez,MOD-2); przez1=pot1(przez1,MOD1-2); odwhasz*=przez; odwhasz%=MOD; odwhasz1*=przez1; odwhasz1%=MOD1; //cout<<odwhasz1; if(hasz==odwhasz&&hasz1==odwhasz1){ printf("TAK"); }else{ printf("NIE"); } return 0; } |