求助 WA11
查看原帖
求助 WA11
254384
XiaoPanPan楼主2021/5/27 21:33

Wrong Answer. wrong answer On line 13 column 1, read 1, expected 2.


#include <unordered_map>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <stack>
#include <deque>
#include <queue>
#include <cmath>
#include <map>
#include <set>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const int N = 1e3 + 10, M = 31 * N;
const int base = 1e9;
const int P = 131;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double PI = acos(-1.0);
ll gcd(ll a, ll b)
{
    return b == 0 ? a : gcd(b, a % b);
}
ll BSGS(ll a, ll b, ll p, ll a1)
{
    if (1 % p == b % p)
        return 0;
    if (a == 0)
    {
        if (b == 0)
            return 1;
        else
            return -1;
    }
    map<ll, ll> hash;
    ll k = sqrt(p) + 1;
    ll ak = 1 % p;
    for (ll i = 0, j = b % p; i < k; ++i)
    {
        ll t = ak * b % p;
        hash[t] = i;
        ak = ak * a % p;
    }
    for (ll i = 0; i <= k; ++i)
    {
        if (hash.count(a1) && i * k - hash[a1] >= 0)
            return i * k - hash[a1];
        a1 = a1 * ak % p;
    }
    return -1;
}
ll exBSGS(ll a, ll b, ll p)
{
    if (b == 1 || p == 1)
        return 0;
    ll cnt = 0, a1 = 1 % p;
    ll d = gcd(a, p);
    while (d > 1)
    {
        if (b % d)
            return -1;
        p /= d;
        b /= d;
        a1 = (a1 * a / d) % p;
        ++cnt;
        if (b == a1)
            return cnt;
        d = gcd(a, p);
    }
    ll res = BSGS(a, b, p, a1);
    if (res == -1)
        return -1;
    else
        return res + cnt;
}
int main()
{
    ll a, b, p;
    while (scanf("%lld%lld%lld", &a, &p, &b), a || b || p)
    {
        a %= p, b %= p;
        ll x = exBSGS(a, b, p);
        if (x == -1)
            printf("No Solution\n");
        else
            printf("%lld\n", x);
    }
    return 0;
}
2021/5/27 21:33
加载中...