扩展BSGS

求解 x k = y ( m o d p ) x ^ k = y (mod p) xk=y(modp) ( x x x p p p 不互质) 类似方程的最小正整数解

具体解析推荐参考这位兄台的博客(~ ̄▽ ̄)~点我啊~~

模板题 : P4195 【模板】exBSGS/Spoj3105 Mod

#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
typedef pair <int,int> pii;


struct HashTable{
	static const int HashMod = 123456;
	struct Line{int u,v,next;} e[100005];
	int h[HashMod], cnt;
	void add(int u,int v,int w){e[++cnt]=(Line){w,v,h[u]};h[u]=cnt;}
	void clear(){memset(h,cnt=0,sizeof(h));}
	void insert(int x, int i){
		int k = x % HashMod;
		add(k, i, x);
	}
	int query(int x){
		for(int i=h[x%HashMod];i;i=e[i].next)
			if(e[i].u==x) return e[i].v;
		return -1;
	}
} Hash;

int qpow(int a, int b, int p){
	int ret = 1;
	while(b){
		if(b & 1) ret = 1ll * ret * a % p;
		a = 1ll * a * a % p;
		b >>= 1;
	}
	return ret;
}

void exgsbs(int x, int y, int p){
	if(y==1) {puts("0");return;}
	int d = __gcd(x, p), k = 1, t = 0;
	while(d^1){
		if(y%d) {puts("No Solution");return;}
		++t; y/=d; p/=d; k=1ll*k*x/d%p;
		if(y==k) {printf("%d\n", t);return;}
		d=__gcd(x, p);
	}
	Hash.clear();
	int s = y, m = sqrt(p) + 1;
	for(int i=0; i<=m; i++){
		Hash.insert(s, i);
		s = 1ll * s * x % p;
	}
	s = k, k = qpow(x, m, p);
	for(int i=1; i<=m; i++){
		s = 1ll * s * k % p;
		int hash = Hash.query(s);
		if(hash == -1) continue;
		printf("%d\n", i*m-hash+t);
		return;
	}
	puts("No Solution");
}

int main() {
	int p, x, y;
	while(1){
		scanf("%d%d%d", &x, &p, &y);
		if(!x && !p && !y) break;
		exgsbs(x, y, p);
	}
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值