蒟蒻求助
查看原帖
蒟蒻求助
201007
Leasier楼主2021/5/14 20:19

RT,#11 WA on line 13258 column 1, read N, expected 3.

代码:

#include <iostream>
#include <map>
#include <cmath>

using namespace std;

typedef long long ll;

map<ll, int> mp;

inline ll quick_pow(ll x, ll p, ll mod){
	ll ans = 1;
	while (p){
		if (p & 1) ans = ans * x % mod;
		x = x * x % mod;
		p >>= 1;
	}
	return ans;
}

inline int bsgs(int a, ll b, int p){
	if (p == 1) return 0;
	a %= p;
	b %= p;
	if (a == 0) return b <= 1 ? 0 : -1;
	if (b == 0) return -1;
	if (b == 1) return 0;
	int m = ceil(sqrt(p)), i = 0;
	ll t = quick_pow(a, m, p) % p;
	mp.clear();
	for (register ll j = b; i <= m; i++, j = j * a % p){
		mp[j] = i;
	}
	i = 1;
	for (register ll j = t; i <= m; i++, j = j * t % p){
		if (mp.count(j)) return i * m - mp[j];
	}
	return -1;
}

int gcd(int a, int b){
	return b == 0 ? a : gcd(b, a % b);
}

void exgcd(ll a, ll b, ll &x, ll &y){
	if (b == 0){
		x = 1;
		y = 0;
		return;
	}
	ll t;
	exgcd(b, a % b, x, y);
	t = x;
	x = y;
	y = t - a / b * y;
}

inline ll inv(ll a, ll b){
	ll x, y;
	exgcd(a, b, x, y);
	return (x % b + b) % b;
}

inline int exbsgs(int a, int b, int p){
	if (p == 1) return 0;
	a %= p;
	b %= p;
	if (b == 1) return 0;
	int x = 0, t, ans;
	ll y = 1;
	while ((t = gcd(a, p)) != 1){
		if (b % t != 0) return -1;
		b /= t;
		x++;
		y = y * (a / t) % p;
		if (b == y) return x;
		p /= t;
	}
	ans = bsgs(a, b * inv(y, p) % p, p);
	if (ans == -1) return -1;
	return ans + x;
}

int main(){
	while (true){
		int a, p, b, ans;
		cin >> a >> p >> b;
		if (a == 0 && p == 0 && b == 0) break;
		ans = exbsgs(a, b, p);
		if (ans == -1){
			cout << "No Solution" << endl;
		} else {
			cout << ans << endl;
		}
	}
	return 0;
}
2021/5/14 20:19
加载中...