ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【模板】BSGS

2022-07-22 11:02:51  阅读:128  来源: 互联网

标签:return res ll float long lld 模板 BSGS


给你\(a,b,p\in \mathbb{N}_+\),请解出方程\(a^x\equiv b\pmod p\)的最小解\(x\in\mathbb{N}_+\)。

#include <stdio.h>
#include <map>
#define ull unsigned long long
#define ll long long
ll light_multi(ll _a,ll _b,ll _p) {
    _a %= _p, _b %= _p;
    ull _c = (long double)_a*_b/_p;
    ull _x = _a*_b, _y = _c*_p;
    ll _res = (ll)(_x%_p)-(ll)(_y%_p);
    if(_res < 0) _res += _p;
    return _res;
}
ll defended_pow(ll _a,ll _n,ll _p) {
	ll _res = 1;
	while(_n) {
		if(_n&1) _res = light_multi(_res,_a,_p);
		_a = light_multi(_a,_a,_p);
		_n >>= 1;
	}
	return _res;
}
float InvSqrt(float x) {
	float xhalf = 0.5f*x;
	int i = *(int*)&x;
	i = 0x5f375a86-(i>>1);
	x = *(float*)&i;
	x = x*(1.5f-xhalf*x*x);
	x = x*(1.5f-xhalf*x*x);
	x = x*(1.5f-xhalf*x*x);
	return x;
}
std :: map<ll,ll> hash;
ll BSGS(ll a,ll b,ll p) {
	b %= p;
	ll t = (ll)(1.0/InvSqrt(p))+1;
	for(ll i = 0;i < t;++i) 
		hash[b*defended_pow(a,i,p)%p] = i;
	a = defended_pow(a,t,p);//ATP www ;
	if(!a) return b == 0 ? 1 : -1;
	for(ll i = 1;i <= t;++i) {
		ll tmp = defended_pow(a,i,p);
		int j = (hash.find(tmp) == hash.end()) ? -1 : hash[tmp];
		if(j >= 0&&i*t-j >= 0) 
			return i*t-j;
	}
	return -1;
}
ll a, b, p;
signed main() {
	scanf("%lld %lld %lld",&p,&a,&b);
	ll ans = BSGS(a,b,p);
	if(ans == -1)  
		printf("no solution");
	else 
		printf("%lld",ans);
}

标签:return,res,ll,float,long,lld,模板,BSGS
来源: https://www.cnblogs.com/bikuhiku/p/BSGS.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有