UR 6 破解密码
SOL :
我们发现 ha[i]=ha[i-1]*26-head*26^(len+1)+head
head是指当前把这玩意扔到队尾的东东。就好了。
还有就是考虑没有逆元的情况。
#include<bits/stdc++.h> #define LL long long #define N 100007 using namespace std; int mo,n,h[N],t; char ans[N]; LL qsm(LL x,LL y=mo-2) { static LL anw; for (anw=1,x=x%mo;y;y=y>>1,x=x*x%mo) if (y&1) anw=anw*x%mo; return anw; } int main () { scanf("%d %d\n",&n,&mo); for (int i=0;i<n;i++) scanf("%d",h+i); t=qsm(qsm(26,n)-1+mo); if (t) { for(int t2,j,i=0;i<n;i++) { j=(i+1)%n; t2=((LL)h[i]*26%mo-h[j]+mo)%mo; ans[i]=(LL)t*t2%mo + 'a'; } printf("%s",ans); } else { int t1=h[0]; for(int i=n-1;~i;i--) ans[i]=h[0]%26+'a',h[0]/=26; printf("%s",ans); } }