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);
    }
} 

 

posted @ 2018-04-19 19:23  泪寒之雪  阅读(346)  评论(0编辑  收藏  举报