拓展欧拉定理学习笔记
拓展欧拉定理
内容
对于 ,有
证明
略
模板
给定三个数 ,求 。
首先根据拓展欧拉定理的内容,先求出 :
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 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();}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具