BZOJ 2480: Spoj3105 Mod【扩展大步小步

80 篇文章 0 订阅
5 篇文章 0 订阅

……裸的ex_BSGS…………然后……

【关于ex_BSGS】:因为要用到逆元的存在,所以在gcd(a,p)!=1的时候,就不能BSGS了,这个时候除一除gcd还是很稳的……嗯……反正拆一个a出来当常数就好


感谢这个加强数据的大爷……让我调了一晚上【x       @1430586275


“2016.3.29新加数据一组 by  1430586275”


当我看到这个↑ 的时候,心情是这样的:反正按照套路码完模板就完事了嘛……能加强到哪儿去

于是就这样了↓(两个1.3k的代码是粘的标程……嗯对其中一个被卡WA了

7*WA,1*T……


……然后我去spoj找到了原题……

啊……A了……????

…………【黑人问号


反正……要各种特判……

哦对了……我后面的几个WA是写错了GG

p==1   ||    p<=0  ||   b==1 ||   a==1 ||  p==1 ||  a==0 。。。。。

其实前面那个1386b的代码我也可以hack的【23333忽然想加强数据x


以上,

剩下的看代码了

#include<bits/stdc++.h>
using namespace std;	long long a,p,b;
long long gcd(long long a,long long b){
	return b?gcd(b,a%b):a;
}
map<long long,int> mp;
long long BSGS(long long a,long long b,long long p){
	if(p==0)	return -1;
	if(a==0)	return b==0?1:-1;
	a%=p,b%=p;
	if(a==0)	return b==0?0:-1;
	if(b==1)	return 0;
	long long t=1;
	long long cnt=0;
	for(long long g=gcd(a,p);g!=1;g=gcd(a,p)){
		if(b%g)	return -1;
		b/=g,p/=g,t=(t*a/g)%p;
		++cnt;
		if(b==t)	return cnt;
	}
	//if(p==1)	return cnt;
	map<long long,int> mpp;
	mpp.swap(mp);
	
	int root_p=ceil(sqrt(p));
	long long tmp=b,ttmp=1;
	for(int i=0;i<root_p;++i,tmp=(tmp*a)%p,ttmp=(ttmp*a)%p)	mp[tmp]=i;
	
	tmp=(ttmp*t)%p;
	for(int i=1;i<=root_p;++i,tmp=(tmp*ttmp)%p)
		if(mp.count(tmp))
			return 1ll*i*root_p-mp[tmp]+cnt;
	return -1;
}
long long ans;
int main(){
	while((~scanf("%lld%lld%lld",&a,&p,&b))&&(p|a|b)){
		~(ans=BSGS(a,b,p))? printf("%lld\n",ans) : puts("No Solution");
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值