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