[Luogu] P3846 [TJOI2007]可爱的质数

时间:2023-01-01 14:33:31

题目描述

给定一个质数P(2<=P<2312^{31}231),以及一个整数B(2<=B<P),一个整数N(2<=N<P)。

现在要求你计算一个最小的L,满足BL≡N(modP)。

题目分析

BSGS裸题。

偷一张网上看到的好图来说明一下BSGS算法(转侵删)

[Luogu] P3846 [TJOI2007]可爱的质数

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;

long long p,b,n;
long long ans = 1;

map<long long,int> Hash;

long long quick_pow(long long x,long long y) {
    long long res = 1;
    while(y) {
        if(y & 1) res = res * x % p;
        x = x * x % p;
        y >>= 1;
    }
    return res;
}

int main() {
    scanf("%lld%lld%lld",&p,&b,&n);
    if(!b%p) {
        puts("no solution");
        return 0;
    }
    long long m = ceil(sqrt(p));
    Hash[n%p] = 0;
    for(long long i = 1;i <= m;i++) {
        Hash[quick_pow(b,i) * n % p] = i;
    }
    long long tmp = quick_pow(b,m);
    for(int i = 1;i <= m;i++) {
        ans = ans * tmp % p;
        if(Hash[ans]) {
            printf("%lld",((i*m - Hash[ans]) % p + p)%p);
            return 0;
        }
    }
    puts("no solution");
    return 0;
}