UVA

来源:互联网 发布:手机九宫格软件 编辑:程序博客网 时间:2024/06/03 21:46

题解

  同学安利了一道拓展欧拉定理题。
  

ab mod p=ab mod ϕ(p) + ϕ(p) mod p

  

递归

代码

//拓展欧拉定理#include <cstdio>#include <algorithm>#define maxn 10005using namespace std;int N, M, prime[maxn], phi[maxn], mark[maxn], a[maxn];void shai(){    int i, j;    phi[1]=1;    for(i=2;i<maxn;i++)    {        if(!mark[i])prime[++*prime]=i, phi[i]=i-1;        for(j=1;i*prime[j]<maxn;j++)        {            mark[i*prime[j]]=1;            if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}            phi[i*prime[j]]=phi[i]*phi[prime[j]];        }    }}int fastpow(int a, int b, int p){    int t=a, ans=1;    for(;b;b>>=1,t=t*t%p)if(b&1)ans=ans*t%p;    return ans;}int dfs(int pos, int p){    if(pos==N)return a[pos]%p;    else return fastpow(a[pos],dfs(pos+1,phi[p])+phi[p],p);}int read(int x=0){    char c=getchar();    while(c<48 or c>57)    {        if(c=='#')return 0;        c=getchar();    }    while(c>=48 and c<=57)x=(x<<1)+(x<<3)+c-48, c=getchar();    return x;}int main(){    int cnt=0;    shai();    while(M=read())    {        N=read();        for(int i=1;i<=N;i++)a[i]=read();        printf("Case #%d: %d\n",++cnt,dfs(1,M));    }    return 0;}
0 0