64pts求助,悬赏一贯
查看原帖
64pts求助,悬赏一贯
550933
Tjaweiof楼主2023/7/4 15:16
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
long long t, k, y, z, p;
int log_mod(int a, int b, int n){
    if (b == 1) return 0;
    gp_hash_table <int, int>hash;
    int t = ceil(sqrt(n));
    long long z = 1;
    for (int i = 0; i < t; i++) {
        hash[b * z % n] = i;
        z = z * a % n;
    }
    int now = 1;
    for (int i = 1; i <= t; i++) {
        now = now * z % n;
        if (hash.find(now) != hash.end()) {
            return i * t - hash[now];
        }
    }
    return -1;
}
long long ksm(long long x, long long p, long long m){
    long long result = 1;
    while (p){
        if (p % 2 == 1){
            result = result * x % m;
        }
        p /= 2;
        x = x * x % m;
    }
    return result;
}
long long exgcd(long long a, long long b, long long &x, long long &y){
    if (b == 0){
        x = 1;
        y = 0;
        return a;
    }
    int ans = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return ans;
}
int main(){
    scanf("%lld%lld", &t, &k);
    while (t--){
        scanf("%lld%lld%lld", &y, &z, &p);
        if (k == 1){
            printf("%lld\n", ksm(y, z, p));
        } else if (k == 2){
            long long xn, yn;
            long long gcd = exgcd(y, p, xn, yn);
            if (z % gcd != 0){
                printf("Orz, I cannot find x!\n");
                continue;
            }
            printf("%lld\n", (xn * z % p + p) % p);
        } else if (k == 3){
            long long ans = log_mod(y, p, z);
            if (ans != -1) cout << ans << endl;
            else cout << "Orz, I cannot find x!" << endl;
        }
    }
    return 0;
}

疑惑,为什么别人都是#21没过,我k=3时就#21过了……

2023/7/4 15:16
加载中...