这是我错#12的代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
bool bigger=0;
int read(int p)
{
int sum=0,f=1;
char c=getchar();
while(!(c>='0'&&c<='9'))
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
sum=sum*10+c-'0';
if(sum>p)
bigger=1;
sum%=p;
c=getchar();
}
return sum*f;
}
int phi(int x)
{
int res=x,tmp=x;
for(int i=2;i*i<=x;i++)
{
if(tmp%i==0)
res=res/i*(i-1);
while(tmp%i==0)
tmp/=i;
}
if(tmp>1)
res=res/tmp*(tmp-1);
return res;
}
int a,p,b;
int qpow(int x,int k,int p)
{
int res=1;
while(k)
{
if(k&1)
res*=x,res%=p;
x=x*x%p;
k>>=1;
}
return res;
}
signed main()
{
cin >>a>>p;
int ph=phi(p);
b=read(ph);
cout <<qpow(a,b+(bigger?ph:0),p)<<endl;
return 0;
}
但我改成这样(只在 sum>p 时取模)
#include <bits/stdc++.h>
#define int long long
using namespace std;
bool bigger=0;
int read(int p)
{
int sum=0,f=1;
char c=getchar();
while(!(c>='0'&&c<='9'))
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
sum=sum*10+c-'0';
if(sum>p)
bigger=1,sum%=p;
c=getchar();
}
return sum*f;
}
int phi(int x)
{
int res=x,tmp=x;
for(int i=2;i*i<=x;i++)
{
if(tmp%i==0)
res=res/i*(i-1);
while(tmp%i==0)
tmp/=i;
}
if(tmp>1)
res=res/tmp*(tmp-1);
return res;
}
int a,p,b;
int qpow(int x,int k,int p)
{
int res=1;
while(k)
{
if(k&1)
res*=x,res%=p;
x=x*x%p;
k>>=1;
}
return res;
}
signed main()
{
cin >>a>>p;
int ph=phi(p);
b=read(ph);
cout <<qpow(a,b+(bigger?ph:0),p)<<endl;
return 0;
}
就过了,求问各位大佬为什么?