拓展欧拉定理学习笔记

拓展欧拉定理

内容

对于 a,mZ,有 ab{abb<φ(m)a(bmodφ(m))+φ(m)b>φ(m)(modp)

证明

模板

P5091 【模板】扩展欧拉定理

给定三个数 a,m,bZ,求 abmodm
1m108,1b1020000000,1a109

首先根据拓展欧拉定理的内容,先求出 φ(m)

int ph(int x){
	int s=x;
    for(int i=2;i*i<=x;i++)if(x%i==0){s-=s/i;while(x%i==0)x/=i;}
	if(x>1)s-=s/x;return s;
}

至于 b 的读入,考虑按位读入,读入的同时取模并判断是否大于 φ(m)

int rd(){
	int x=0;char c=getchar();while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9'){x*=10,x+=(c^'0');if(x>=mod)f=1;x%=mod;c=getchar();}return x;
}

剩下的就是一个快速幂了,因为全定义了全局变量所以没有传参。

int ksm(){int s=1,g=a;while(b){if(b&1)s=s*g%m;b>>=1;g=g*g%m;}return s;}

最后放一下完整代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;int mod,a,m,b,f;int ph(int x){
	int s=x;for(int i=2;i*i<=x;i++)if(x%i==0){s-=s/i;while(x%i==0)x/=i;}
	if(x>1)s-=s/x;return s;
}int ksm(){int s=1,g=a;while(b){if(b&1)s=s*g%m;b>>=1;g=g*g%m;}return s%m;}int rd(){
	int x=0;char c=getchar();while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9'){x*=10,x+=(c^'0');if(x>=mod)f=1;x%=mod;c=getchar();}return x;
}signed main(){cin>>a>>m;mod=ph(m);b=rd();if(f)b+=mod;cout<<ksm();}

To be continued……

posted @   AIskeleton  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示