您的位置:首页 > 其它

指数循环节 uva 10692

2017-08-02 14:37 477 查看
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int d[1000],n,m;
int qcal(int a,int n,int m)
{
int res=1;
while(n)
{
if(n&1)
res=res*a%m;
n>>=1;
a=a*a%m;
}
return res;
}
int pcal(int n)
{
int m=(int)sqrt(n+0.5);
int res=n;
for(int i=2;i<=m;i++)
if(n%i==0)
{
res=res/i*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)
res=res/n*(n-1);
return res;
}
int solve(int lo,int m)
{
if(lo==n-1)
return d[lo]%m;
int phi=pcal(m);
int t;
//	if(d[lo+1]>=phi)
t=solve(lo+1,phi)+phi;
//	else
//	t=solve(lo+1,m);
return qcal(d[lo],t,m);
}
int main()
{
char str[1000];
int t=1;
while(~scanf("%s",str)&&str[0]!='#')
{
sscanf(str,"%d",&m);
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&d[i]);
printf("Case #%d: %d\n",t++,solve(0,m));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: