疑惑?
查看原帖
疑惑?
369181
bamboo12345楼主2022/5/8 21:20

这是我错#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>psum>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;
}

就过了,求问各位大佬为什么?

2022/5/8 21:20
加载中...