【POJ 3243】Clever Y 拓展BSGS

调了一周,我真制杖,,,

各种初始化没有设为1,,,我当时到底在想什么???

拓展BSGS,这是zky学长讲课的课件截屏:

是不是简单易懂。PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那是因为聪哥早就会了,所以他觉得学这个没用,信他才怪233

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL A,B,C;
struct node{
	static const int mo=100007;
	LL a[mo],v[mo];
	void clear() {memset(a,-1,sizeof(a));}
	LL find(LL val){
		LL pos=(val%mo+mo)%mo;
		while ((a[pos]!=val)&&(a[pos]!=-1)) pos=(pos+1)%mo;
		return pos;
	}
	void insert(int val,int x){
		LL pos=find(val);
		if ((a[pos]==-1)||(a[pos]==val)){
			a[pos]=val; v[pos]=x;
		}
	}
	LL get(LL val){
		LL pos=find(val);
		return a[pos]==val?v[pos]:-1;
	}
}hash;
LL gcd(LL x,LL y) {LL r=x%y; while (r!=0){x=y; y=r; r=x%y;} return y;}
void exgcd(LL aa,LL bb,LL &x, LL&y){
	if (bb==0){
		x=1; y=0; return;
	}
	exgcd(bb,aa%bb,x,y);
	LL t=y;
	y=x-aa/bb*y;
	x=t;
}
LL ni(LL a,LL b){
	LL x,y;
	exgcd(a,b,x,y);
	return (x+C)%C;
}
LL ipow(LL a,LL b,LL c){
	LL ans=1,t=a;
	while (b){
		if (b%2==1) ans=(ans*t)%c;
		t=(t*t)%C; b/=2;
	}
	return ans;
}
void bsgs(){
	B%=C;
	if (B==1) {puts("0"); return;}
	else if ((A==0)&&(B==0)) {puts("1"); return;}
	else if (B==0) {puts("No Solution"); return;}
	LL t=1;
	for(LL i=0;i<=50;++i){
		if (t==B){
			printf("%I64d\n",i);
			return;
		}
		t=(t*A)%C;
	}
	LL g,ans1=0,D=1;
	while ((g=gcd(A,C))!=1){
		if (B%g){
			puts("No Solution");
			return;
		}
		++ans1;
		B/=g;
		C/=g;
		D=(A/g*D)%C;
	}
	D=ni(D,C);
	LL m=ceil(sqrt((double)C));
	hash.clear();
	t=B*D%C;
	for(LL i=0;i<=m;++i){
		hash.insert(t,i);
		t=(t*A)%C;
	}
	LL basic=ipow(A,m,C);
	t=1;
	for(LL i=0;i<=m;++i){
		int x=hash.get(t);
		if (x!=-1){
			printf("%I64d\n",ans1+i*m-x);
			return;
		}
		t=(t*basic)%C;
	}
	puts("No Solution");
}
int main(){
	while (scanf("%I64d %I64d %I64d\n",&A,&C,&B)){
		if ((A==0)&&(B==0)&&(C==0)) break;
		bsgs();
	}
	return 0;
}

这样就可以啦

时间: 2024-10-24 01:56:57

【POJ 3243】Clever Y 拓展BSGS的相关文章

POJ 3243 Clever Y 扩展BSGS

http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details/73162229 在大约sqrt( p )的复杂度求出 ( a^x ) % p = b % p中的x 扩展bsgs增加了对p不是素数的情况的处理. 扩展bsgs在处理过a,b,p之后进行bsgs的时候x处理不到num以下的部分,这部分在处理a,b,p的时候处理过了(b=1输出num)所以不用考虑.

poj 3243 Clever Y 高次方程

1 Accepted 8508K 579MS C++ 2237B/** 2 hash的强大,,还是高次方程,不过要求n不一定是素数 3 **/ 4 #include <iostream> 5 #include <cstdio> 6 #include <cmath> 7 #include <cstring> 8 #include <algorithm> 9 using namespace std; 10 long long a,b,n; 11 co

POJ 3243 Clever Y BSGS

Clever Y Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6861   Accepted: 1676 Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, Y, Z, we all know how to figure out K fast. However, give

POJ 3243 Clever Y Extended-Baby-Step-Giant-Step

题目大意:给定A,B,C,求最小的非负整数x,使A^x==B(%C) 传说中的EXBSGS算法0.0 卡了一天没看懂 最后硬扒各大神犇的代码才略微弄懂点0.0 參考资料: http://quartergeek.com/bsgs/ http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 这两位写的比較具体0.0 能够用于參考 对拍时发现自己代码各种脑残0.0 伤不起啊 #include<cmath> #include<cstd

【POJ】3243 Clever Y

http://poj.org/problem?id=3243 题意:求$a^y \equiv b \pmod{p}$最小的$y$.(0<=x, y, p<=10^9) #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> typedef long long ll; using namespace st

BZOJ 3243 Clever Y

Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, Y, Z, we all know how to figure out K fast. However, given X, Z, K, could you figure out Y fast? Input Input data consists of no more than 20 test ca

Clever Y POJ - 3243 (扩展BSGS)

Clever Y POJ - 3243 题意:给a,c,b,求最小的x使得 ax≡b (mod c). 扩展BSGS算法~ 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #define ll long long 6 using namespace std; 7 const int mod=99991; 8 ll head[mod],nex

【EXT-BSGS算法求离散对数】POJ Clever Y 3243

Clever Y Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7259 Accepted: 1795 Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, Y, Z, we all know how to figure out K fast. However, given X,

数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSGS算法中是要求a^m在%c条件下的逆元的,如果a.c不互质根本就没有逆元.) 如果x有解,那么0<=x<C,为什么? 我们可以回忆一下欧拉定理: 对于c是素数的情况,φ(c)=c-1 那么既然我们知道a^0=1,a^φ(c)=1(在%c的条件下).那么0~φ(c)必定是一个循环节(不一定是最小的)