您的位置:首页 > 其它

HDU 4335 What is N?

2014-05-26 17:36 429 查看
#include "iostream"
#include "cstdio"
#include "cmath"
#include "algorithm"
#include "map"
#define LL unsigned __int64
using namespace std;

//返回ab mod n
LL mul_mod(LL a,LL b,LL c)
{
LL ret=0,tmp=a%c;
while(b)
{
if(b&0x1)if((ret+=tmp)>=c)ret-=c;
if((tmp<<=1)>=c)tmp-=c;
b>>=1;
}
return ret;
}
//快速幂
LL pow_mod(LL a,LL p,LL n){
if(p==0)  return 1%n;
LL ans=pow_mod(a,p/2,n);
ans=mul_mod(ans, ans, n);
if(p%2==1)  ans=mul_mod(ans, a, n);
return ans%n;
}
//求单个数的欧拉函数值
LL euler_phi(LL n){
LL m=(int)sqrt(n+0.5);
LL ans=n;
for(int i=2;i<=m;i++)
if(n%i==0){
ans=ans/i*(i-1);
while (n%i==0)   n/=i;
}
if(n>1)  ans=ans/n*(n-1);
return ans;
}

int main(){
int T;
scanf("%d",&T);
int kase=1;
int b,p;
LL m;
while(T--){
//scanf("%d%d%llu",&b,&p,&m);
cin>>b>>p>>m;
b=b%p;
LL phi=euler_phi(p);
LL base=1;
LL add=0;
int flag;
LL ans=0;
for(int i=0;i<=p;i++){
base*= i? i:1;
if(base>=phi)  add=phi;
base%=phi;
if(!base)  {flag=i;break;}
if(i<=m&&pow_mod(i,base+add,p)==b)  ans++;
}
for(int i=0;i<p&&i<=m;i++){
if(pow_mod(i,phi,p)==b){
ans+=(m-i)/p+1;
if(flag>=i+1){
ans-=(flag-i-1)/p+1;
}
}
}
if(m==18446744073709551615LL&&p == 1&&b == 0)
{
printf("Case #%d: 18446744073709551616\n", kase++);
}
else
printf("Case #%d: %I64u\n", kase++, ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: