首页 > 其他 > 详细

【洛谷P3846】可爱的质数

时间:2020-01-27 12:16:46      阅读:81      评论:0      收藏:0      [点我收藏+]

题目

题目链接:https://www.luogu.com.cn/problem/P3846
给出\(a,b,p\),保证\(p\)是质数,求一个最小的\(k\)满足\(a^k\equiv n(\rm \mod\ p)\)

思路:

\(BSGS\)模板题。果然我菜到只会敲模板了吗。
\(t=\sqrt{p},k=i\times t-j\),那么移项得\((a^t)^i \equiv b\times a^j\),其中\(i,j\leq t\)
那么我们可以把\(b\times a^j(j\in [0,t])\)插入一个\(hash\)表内,然后再枚举\(i\)求出\((a^t)^i\),如果这个值在\(hash\)表内有出现,那么答案就是\(i\times t-hash[]\)
时间复杂度\(O(sqrt{p})\)。由于\(hash\)表我使用了\(map\),实际上还要多一个\(log\)

代码

#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;

int a,b,p,t;
map<int,int> hash;

int power(ll x,ll k,int MOD)
{
    ll ans=1;
    for (;k;k>>=1,x=x*x%MOD)
        if (k&1) ans=ans*x%MOD;
    return (int)ans;
}

int main()
{
    scanf("%d%d%d",&p,&a,&b);
    t=sqrt(p)+1;
    for (int i=0;i<=t;i++)
        hash[1LL*b*power(a,i,p)%p]=i;
    a=power(a,t,p);
    for (int i=1;i<=t;i++)
    {
        int val=power(a,i,p);
        if (hash[val])
            return !printf("%lld",(1LL*(i*t-hash[val])%p+p)%p);
    }
    printf("no solution");
    return 0;
}

【洛谷P3846】可爱的质数

原文:https://www.cnblogs.com/stoorz/p/12235584.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!