为什么全开ULL WA了11,12,改成int反而过了
查看原帖
为什么全开ULL WA了11,12,改成int反而过了
138799
jzdywf楼主2022/2/14 21:27

本菜鸡感觉非常神奇,求大佬解答

这是全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;
}

然后不知道怎么回事就过了。。。。。。

2022/2/14 21:27
加载中...