40分,其他wa了,我枯死了,求救,谢谢了
查看原帖
40分,其他wa了,我枯死了,求救,谢谢了
546830
XSean楼主2023/3/2 14:43
/*
    Author: Sean_xzx
    Right Output! & Accepted!
本题核心:
1.
本题步骤:
1.
*/
#include <bits/stdc++.h>

#define LL long long
#define ULL unsigned long long
#define PII pair<int, int>
#define PIL pair<int, long long>
#define PLI pair<long long, int>
#define PLL pair<long long, long long>
#define mp make_pair
#define eb emplace_back
#define pb push_back
#define pf push_front
#define fi first
#define se second
#define sf scanf
#define prf printf
#define el putchar('\n')
#define mms(arr, n) memset(arr, n, sizeof(arr))
#define mmc(arr1, arr2) memcpy(arr1, arr2, sizeof(arr2))
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
//const int mod = 998244353;
//const int mod = ;

template <typename T> inline void rd(T &x){
    x = 0; bool f = true; char ch = getchar();
    while(ch < '0' || ch > '9'){ f = ((ch == '-') ? false : true); ch = getchar();}
    while(ch >= '0' && ch <= '9'){ x = (x << 1) + (x << 3) + (ch ^ '0'); ch = getchar();}
    if(!f) x = -x;
}
template <typename T, typename ...Args> inline void rd(T &x, Args &...args){ rd(x); rd(args...);}

using namespace std;

int p, a, b;

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

int qmi(LL a, int k, int p){
    int res = 1;
    for(; k; k >>= 1, a = a * a % p) if(k & 1) res = res * a % p;
    return res;
}

int exBSGS(int p, int a, int b){
    // 1.得到新的同余式
    a %= p, b %= p;
    int D = 1, k = 0, d; 
    auto calc = [&](){ D *= d, p /= d, b /= d;};
    while(1){
        d = gcd(a, p);
        if(k == 1) break;
        if(b % d != 0) return -1;
        calc(); k++;
    }
    // 2.用BSGS计算x
    unordered_map<int, int> mmap; // 用于做j的hash
    int ta = qmi(a, k, p) / D; // a^{x-k}的系数
    int m = (int)sqrt(p) + 1;
    int tt = qmi(a, m, p);
    int t = (LL)ta * tt % p;

    for(int j = 0; j <= m; j++){
        mmap[b] = j;
        b = (LL)b * a % p;
    }
    int gi, gj, f = 0;
    for(int i = 1; i <= m; i++){
        auto c = mmap[t]; // 常数大
        if(c){ f = 1, gi = i, gj = c; break;}
        t = (LL)t * tt % p;
    }

    if(f) return gi * m - gj + k; // 一开始减的后面加上
    else return -1;
}


int main(){
    //freopen(".in", "r", stdin);
    //freopen(".out", "w", stdout);
    while(rd(a, p, b), a || p || b){
        int ans = exBSGS(p, a, b);
        if(ans == -1) prf("No Solution\n");
        else prf("%d\n", ans);  
    }
    return 0;   
}
2023/3/2 14:43
加载中...