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<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1001001
using namespace std;
typedef long long ll;
typedef pair<ll,ll> abcd;
ll A,B,C,D,hash_table[M],val[M],tim[M],tot;
int Hash(ll x)
{
	int pos=x%M;
	while(1)
	{
		if(tim[pos]!=tot)
			tim[pos]=tot,hash_table[pos]=-1,val[pos]=0x3f3f3f3f;
		if(hash_table[pos]==-1||hash_table[pos]==x)
			return hash_table[pos]=x,pos;
		else
			++pos,pos%=M;
	}
}
int Get_Hash(ll x)
{
	int pos=x%M;
	while(1)
	{
		if(tim[pos]!=tot)
			tim[pos]=tot,hash_table[pos]=-1;
		if(hash_table[pos]==-1)
			return -1;
		if(hash_table[pos]==x)
			return pos;
		else
			++pos,pos%=M;
	}
}
ll GCD(ll x,ll y)
{
	return y?GCD(y,x%y):x;
}
abcd EXGCD(ll x,ll y)
{
	if(!y) return abcd(1,0);
	abcd temp=EXGCD(y,x%y);
	return abcd(temp.second,temp.first-x/y*temp.second);
}
ll Inverse(ll x)
{
	ll temp=EXGCD(x,C).first;
	return (temp%C+C)%C;
}
ll Extended_Big_Step_Giant_Step()
{
	ll i,m,cnt=0,temp,base=1;
	int pos;
	B%=C;
	for(i=0,temp=1%C;i<=50;i++,temp*=A,temp%=C)
		if(temp==B)
			return i;
	D=1;
	while(temp=GCD(A,C),temp!=1)
	{
		if(B%temp)
			return -1;
		++cnt;
		B/=temp;
		C/=temp;
		D*=A/temp;
		D%=C;
	}
	B*=Inverse(D);B%=C;
	m=(ll)ceil(sqrt(C)+1e-5);
	++tot;
	for(i=0,temp=1%C;i<m;i++,temp*=A,temp%=C)
		pos=Hash(temp),val[pos]=min(val[pos],i);
	for(i=1,base=1%C;i<=m;i++,base*=A,base%=C);
	for(i=0,D=1%C;i<m;i++,D*=base,D%=C)
	{
		temp=EXGCD(D,C).first*B;
		temp=(temp%C+C)%C;
		pos=Get_Hash(temp);
		if(~pos)
			return i*m+val[pos]+cnt;
	}
	return -1;
}
int main()
{
	memset(hash_table,0xff,sizeof hash_table);
	while(cin>>A>>C>>B,A||B||C)
	{
		ll ans=Extended_Big_Step_Giant_Step();
		if(ans==-1)
			puts("No Solution");
		else
			cout<<ans<<endl;
	}
}
时间: 2024-11-10 11:50:31

POJ 3243 Clever Y Extended-Baby-Step-Giant-Step的相关文章

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 扩展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 2417 Discrete Logging ( Baby step giant step )

Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3696   Accepted: 1727 Description Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarithm of N, b

数论之高次同余方程(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)必定是一个循环节(不一定是最小的)

HDU 2815 扩展baby step giant step 算法

题目大意就是求 a^x = b(mod c) 中的x 用一般的baby step giant step 算法会超时 这里参考的是http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 map平衡树查找值 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <

【poj2417】baby step giant step

最近在学习数论,然而发现之前学的baby step giant step又忘了,于是去翻了翻以前的代码,又复习了一下. 觉得总是忘记是因为没有彻底理解啊. 注意baby step giant step只能用在b和p互质的情况下,因为只有b和p互质的情况下,b才有mod p下的逆元.(下面要用到逆元) 当b和p不互质,就要处理一下.现在就正在做这么一题,方法以后再写. 求a^(-m)就用到了求逆元了,那么如何求逆元呢?我学了两种方法: ·1:欧拉定理:当a和n互质,a^φ ( n) ≡ 1(mod

HDU 2815 Mod Tree 离散对数 扩展Baby Step Giant Step算法

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2815 题意: 思路:与上题不同,这道题不要求m是素数,是利用扩展Baby Step Giant Step算法求离散对数. 以下转载自:AekdyCoin [扩展Baby Step Giant Step] [问题模型] 求解 A^x = B (mod C) 中 0 <= x < C 的解,C 无限制(当然大小有限制--) [写在前面] 这个问题比较麻烦,目前网络上流传许多版本的做法,不过大部分已近被证明

【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