逆元问题
  • 板块学术版
  • 楼主归游
  • 当前回复14
  • 已保存回复14
  • 发布时间2021/8/23 16:00
  • 上次更新2023/11/4 09:20:21
查看原帖
逆元问题
228993
归游楼主2021/8/23 16:00

测试数据 求逆元

71 32

线性求

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;
const int maxn=3e6+10;
long long inv[maxn];
int n,p;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9' || ch<'0'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}return x*f;
}
int main(){
	n=read(),p=read();inv[1]=1;
	for(int i=2;i<=n;++i){
		inv[i]=(p-p/i)*inv[p%i]%p;
	}printf("%lld",inv[n]); 
	return 0;
}

输出:0

扩展欧几里德

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;
const int maxn=3e6+10;
long long inv[maxn];
int n,p;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9' || ch<'0'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}return x*f;
}
int exgcd(int a,int b,int &x,int &y){
	if(!b){
		x=1,y=0;
		return a;
	}
	int d=exgcd(b,a%b,x,y);
	int temp=x;
	x=y;
	y=temp-(a/b)*y;return d;
}
int main(){
	n=read(),p=read();
	int x,y;
	int d=exgcd(n,p,x,y);
	cout<<(x+p)%p<<endl;
	return 0;
}

输出:23

我知道扩欧算出来是对的,那么为什么线性推是错的

2021/8/23 16:00
加载中...