本菜鸡感觉非常神奇,求大佬解答
这是全ULL的代码
#include<bits/stdc++.h>
using namespace std;
string b;
long long len;
unsigned long long k,p,c;
unsigned long long a,m,ans;
unsigned long long Gcd(unsigned long long x,unsigned long long y){
if(y==0){
return x;
}
return Gcd(y,x%y);
}
long long f(long long x){
long long ans=x;
for(long long i=2;i*i<=x;i++){
if(x%i==0){
ans=ans/i*(i-1);
while(x%i==0){
x/=i;
}
}
}
if(x>1){
ans=ans/x*(x-1);
}
return ans;
}
bool check(string x,long long y){
int lenn;
int d[110];
long long now=y;
while(now){
now/=10;
lenn++;
}
if(lenn>len){
return false;
}
if(lenn<len){
return true;
}
now=y;
for(int i=lenn-1;i>=0;i--){
d[i]=now%10;
now/=10;
}
for(int i=0;i<len;i++){
if(b[i]-'0'>d[i]){
return true;
}
if(b[i]-'0'<d[i]){
return false;
}
}
return true;
}
unsigned long long qpow(unsigned long long a,unsigned long long b){
unsigned long long mul=1,base=a;
while(b){
if(b&1){
mul*=base;
mul%=m;
}
base*=base;
base%=m;
b>>=1;
}
return mul;
}
int main(){
cin>>a>>m;
cin>>b;
len=b.length();
c=Gcd(a,m);
p=f(m);
for(int i=0;i<len;i++){
k=(k<<3)+(k<<1)+b[i]-'0';
k%=p;
}
if(check(b,p)){
k+=p;
}
ans=qpow(a,k);
cout<<ans;
return 0;
}
这是改成int之后的代码
#include<bits/stdc++.h>
using namespace std;
int len;
string b;
int k,p,c;
int a,m,ans;
int Gcd(int x,int y){
if(y==0){
return x;
}
return Gcd(y,x%y);
}
int f(int x){
int ans=x;
for(int i=2;i*i<=x;i++){
if(x%i==0){
ans=ans/i*(i-1);
while(x%i==0){
x/=i;
}
}
}
if(x>1){
ans=ans/x*(x-1);
}
return ans;
}
long long qpow(int a,int b){
long long mul=1,base=a;
while(b){
if(b&1){
mul*=base;
mul%=m;
}
base*=base;
base%=m;
b>>=1;
}
return mul;
}
int main(){
cin>>a>>m;
cin>>b;
len=b.length();
c=Gcd(a,m);
p=f(m);
bool flag=0;
for(int i=0;i<len;i++){
k=(k<<3)+(k<<1)+b[i]-'0';
if(k>=p){
flag=1;
}
k%=p;
}
if(flag){
k+=p;
}
ans=qpow(a,k);
cout<<ans;
return 0;
}
然后不知道怎么回事就过了。。。。。。