您的位置:首页 > 其它

hdu4335 (指数循环节)

2013-08-10 19:36 363 查看


hdu4335 (指数循环节)

分类: 数论2013-03-01
16:20 63人阅读 评论(0) 收藏 举报

题目:What is N?

本题好坑人,居然还有那种情况。。。

[cpp] view
plaincopy

#include <stdio.h>

#define LLU unsigned long long

LLU Euler(LLU n)

{

LLU i;

LLU ret=n;

for(i=2;i*i<=n;i++)

{

if(n%i==0)

{

ret=ret-ret/i;

while(n%i==0) n/=i;

}

}

if(n>1)

ret=ret-ret/n;

return ret;

}

LLU quick_mod(LLU a,LLU b,LLU m)

{

LLU ans=1;

while(b)

{

if(b&1)

{

ans=ans*a%m;

b--;

}

b>>=1;

a=a*a%m;

}

return ans;

}

LLU f[100001];

int main()

{

int t,T,i,k,l,flag;

LLU b,p,m,phi,ans;

scanf("%d",&T);

for(t=1;t<=T;t++)

{

ans=0;flag = 0;

scanf("%I64u%I64u%I64u",&b,&p,&m);

if(b==0&&p==1&&m==18446744073709551615ull)

{

printf("Case #%d: 18446744073709551616\n",t);

continue;

}

phi=Euler(p);

f[0]=1;

if(b==0)

ans++;

for(i=1;i<=m;i++)

{

f[i] = f[i-1]*i;

if(f[i]>=phi)

{

f[i]=f[i]%phi;

flag=1;

if(f[i]==0)

break;

}

if(flag)

{

if(quick_mod(i,f[i]+phi,p)==b)

ans++;

}

else

{

if(quick_mod(i,f[i],p)==b)

ans++;

}

}

for(k=0;i<=m&&k<p;i++,k++)

if(quick_mod(i,phi,p)==b)

ans = ans+1+(m-i)/p;

printf("Case #%d: %I64u\n",t,ans);

}

return 0;

}


NEFU 691(欧拉函数与指数循环节)

分类: 数论2013-04-30
06:08 84人阅读 评论(0) 收藏 举报

题目:Remainder Calculator

[cpp] view
plaincopy

#include <iostream>

#include <string.h>

#include <stdio.h>

using namespace std;

typedef long long LL;

const int N=105;

LL p
,a
;

LL phi(LL n)

{

LL rea=n,i;

for(i=2;i*i<=n;i++)

{

if(n%i==0)

{

rea=rea-rea/i;

while(n%i==0) n/=i;

}

}

if(n>1)

rea=rea-rea/n;

return rea;

}

void Init(LL m)

{

p[0]=m;

for(LL i=1;i<105;i++)

p[i]=phi(p[i-1]);

}

LL Solve(LL k,LL *up)

{

LL i,j,chk;

LL m=p[k];

LL res,num,next,num_is_big=0;

if (m==1)

{

if(a[k]>1) *up=1;

else *up=0;

return 0;

}

if (a[k]>=m) {*up=1; return 0;}

num=1;

for(i=2;i<=a[k];i++)

{

num=num*i;

if (num>=m) num_is_big=1, num%=m;

}

next=Solve(k+1,&chk);

if (chk==1) next+=phi(m);

res=1; *up=0;

for(i=0;i<next;i++)

{

res=res*num;

if (res>=m) *up=1,res%=m;

if (num_is_big) *up=1;

}

return res;

}

int main()

{

LL n,t,m,i;

cin>>t;

while(t--)

{

cin>>n>>m;

for(i=0;i<n;i++)

cin>>a[i];

if(m==1)

{

puts("0");

continue;

}

Init(m);

cout<<Solve(0,&i)<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: