扩展欧拉定理 模板题 题解 #P5091 洛谷

声明,有两个代码,18分的是自己做的暴力,满分的是 用户 Owen_codeisking 的代码 ,附上自己的注释
题目链接 :题目
自己去查扩展欧拉定理
或者,看看我马上要写的博客
嘻嘻嘻,又有阅读量了
18分暴力:
思路:暴力计算a的b次方
用我之前博客里的快速幂代码
代码 cpp

#include
using namespace std;
long long a,m,b;
int fast_pow(int x,int y)
{
	int v=1;
	while(y)
	{
		if(y&1)v=v*x;
		x=x*x;
		y>>=1;
		v%=m;
	}
	return v%m;
}
int main()
{
	scanf("%ld%ld%ld",&a,&m,&b);
	printf("%ld",fast_pow(a,b)%m);
	return 0;
 } 

我发现:任何暴力,都只有18分
100分正解: 这是那位大佬的做法

#include 
#define ll long long
using namespace std;
ll a,m,b;

inline ll read(ll m){//快读 
	register ll x=0,f=0;char ch=getchar();
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch)){
		x=x*10+ch-'0';
		if(x>=m) f=1;
		x%=m;ch=getchar();
	}
	return x+(f==1?m:0);
}

ll phi(ll n){//求n的欧拉函数 
	ll ans=n,m=sqrt(n);
	for(ll 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;
}

ll fast_pow(ll a,ll b,ll p){// 快速幂 ,附带上%p 
	ll ret=1;
	for(;b;b>>=1,a=a*a%p)
		if(b&1) ret=ret*a%p;
	return ret;
}

int main()
{
    scanf("%lld%lld",&a,&m);
    b=read(phi(m));//要把指数b分解 ,把分解融入快读里,妙   
    printf("%lld\n",fast_pow(a,b,m));
    return 0;
}

orz
膜拜

谢谢阅读

你可能感兴趣的:(初赛知识,题解,毛大帅逼的cpp爆零生涯,c++,cpp,抽象代数)