码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu3846 [TJOI2007] 可爱的质数/【模板】BSGS

时间:2020-07-22 20:25:55      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:ash   div   puts   isp   name   方法   lang   while   http   

https://www.luogu.com.cn/problem/P3846

\(BSGS\)

\(BSGS\)可以\(O( \sqrt{p} )\)处理:

\[b^l \equiv n (mod \quad p) \]

处理方法十分常规

\[令t=\sqrt{p}+1\设l=kt-m\则b^{kt-m} \equiv n (mod \quad p)\b^{kt} \equiv nb^m (mod \quad p)\预处理出 nb^m(0 \le m<t)\用b^{kt} \mod p去匹配(map或Hash表)\\]

\(C++ Code:\)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
ll p,b,n;
map<ll,int>a;
ll ksm(ll x,ll y)
{
    ll ans=1;
    while (y)
    {
        if (y&1)
            ans=ans*x%p;
        x=x*x%p;
        y >>=1;
    }
    return ans;
}
int main()
{
    scanf("%lld%lld%lld",&p,&b,&n);
    if (n==1)
    {
        printf("0\n");
        return 0;
    }
    int g=(int)sqrt(p)+1;
    ll c=n%p;
    for (int i=0;i<g;i++)
    {
        a[c]=i+1;
        c=c*b%p;
    }
    ll y=ksm(b,g);
    ll e=1;
    for (int i=1;i<=g;i++)
    {
        e=e*y%p;
        if (a[e])
        {
            printf("%lld\n",(ll)i*g-(ll)(a[e]-1));
            return 0;
        }
    }
    puts("no solution");
    return 0;
}

Luogu3846 [TJOI2007] 可爱的质数/【模板】BSGS

标签:ash   div   puts   isp   name   方法   lang   while   http   

原文地址:https://www.cnblogs.com/GK0328/p/13362627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!