gcd 1
由于22222222上不去博客园,暂时把gcd等玩意扔在这里
本部机房不行
1.gcd的求法:
辗转相除法:
递归
int gcd(int a,int b){
return b?gcd(b,a%b:a;
}
非递归
ll gcd(ll x,ll y){
ll r=x%y;
while(r){
x=y;
y=r;
r=x%y;
}
return y;
}
2.ex-gcd(待修LaTeX)
exgcd主要解决线性同余方程问题
首先我们可以把它写成二元一次方程形式
然后套裴蜀定理判有无解
然后套exgcd出一组数,得到一个特解
然后这个特解就可以出一组通解
然后套通解式子得出目标解即可
适用范围:一个一元线性同余方程
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;
y=0;
return a;
}
int ans=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return ans;
}
3.乘法逆元
解决特殊状态下的线性同余方程
不同点在于带除,此时需要转化一下
1.m是质数,b小于m,费马小定理即可
2.b,m互质,exgcd即可
3.线性求逆元,
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int o=5e7;
ll n,p;
ll a[o];
int main(){
a[1]=1;
scanf("%lld%lld",&n,&p);
printf("1\n");
for(ll i=2;i<=n;i++){
a[i]=(ll)(p-p/i)*a[p%i]%p;
printf("%lld\n",a[i]);
}
return 0;
}
RT
4.欧拉函数
求N以内所有和N互质的数的个数,即为欧拉函数
单个
int phi(int n){
int ans=n;
for(int i=2;i<=sqrt(n);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
}
线性
for(int i=1;i<N;i++)
ans1[i]=ans1[i-1]*i%MOD;
inv[1]=1;
for(int i=2;i<N;i++){
if(i>=MOD)break;
inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
}
ans2[1]=1;
for(int i=2;i<N;i++){
if(prime[i]){
ans2[i]=ans2[i-1]*(i-1)%MOD;
ans2[i]=ans2[i]*inv[i%MOD]%MOD;
}
else ans2[i]=ans2[i-1];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具