社区讨论

80pts求条

P3811【模板】模意义下的乘法逆元参与者 3已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mhjusfod
此快照首次捕获于
2025/11/04 08:51
4 个月前
此快照最后确认于
2025/11/04 08:51
4 个月前
查看原帖
P3811
我的解法一(费马小定理): 32pts
CPP
#include<iostream>
using namespace std;
int qp(int a,int b,int p){
    int ans=a%p,res=1;
    while(b){
        if(b&1)res=res*ans%p;
        ans=ans*ans%p;
        b>>=1;
    }
    return res;
}
int main(){
    //费马小定理求
    //a^(p-1)=ax
    //x=a^(p-2)
    int n,p;cin>>n>>p;
    for(int i=1;i<=n;i++){
        cout<<qp(i,p-2,p)<<'\n';
    }
    return 0;
}
我的解法二(扩展欧几里得算法): 80pts
CPP
#include<iostream>
using namespace std;
/*
aX+bX=1
bX+(a-[a/b]*b)Y=1
Ya+(X-[a/b]Y)b=1
*/
//x=Y,y=X-[a/b]Y
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
void exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;
        y=0;
        return;
    }
    exgcd(b,a%b,x,y);
    int tmp=y;
    y=x-(a/b)*y;
    x=tmp;
}
//ax+by=0
//a*b/gcd(a,b)+a*b/gcd(a,b)=0
//x=b/gcd(a,b),y=a/gcd(a,b)
void ze(int a,int b,int &x,int &y){
    int c=gcd(a,b);
    x=b/c;
    y=a/c;
}
int inv(int a,int b){
    int x,y;
    exgcd(a,b,x,y);
    int jx,jy;
    ze(a,b,jx,jy);
    while(x<0)x+=jx;
    return x;
}
int main(){
    int n,p;cin>>n>>p;
    for(int i=1;i<=n;i++)cout<<inv(i,p)<<'\n';
    return 0;
}
解法三(未知): 100pts
CPP

回复

8 条回复,欢迎继续交流。

正在加载回复...