BSGS算法

转自:http://blog.csdn.net/clove_unique

问题

给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$

题解

这就是经典的BSGS算法,方法如下:
令$x=im−j$,$m=⌈\sqrt{p}⌉$,则$a^{im−j}≡b(mod \ p)$
移项,得$(a^m)^i≡ba^j(mod \ p) $
首先,从$0−m$枚举$j$,将得到的$ba^j$的值存入hash表;
然后,从$1−m$枚举$i$,计算$(a^m)^i$,查表,如果有值与之相等,则当时得到的$im−j$是最小值。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<cmath>
#define int long long
using namespace std;
int p;
int pw(int x,int y)
{
int lst=;
while(y)
{
if(y&)lst=lst*x%p;
y>>=;
x=x*x%p;
}
return lst;
}
int xx,yy;
void exgcd(int a,int b)
{
if(b==)
{
xx=;yy=;
return ;
}
exgcd(b,a%b);
int tmp=xx;
xx=yy;
yy=tmp-(a/b)*yy;
return ;
} map<int,int>mp;
int work(int a,int b)
{
int m=ceil(sqrt(p));
mp.clear();
int now=;
mp[now*b%p]=;
for(int i=;i<=m;i++)
{
now=now*a%p;
mp[now*b%p]=i;
}
int tmp=;
for(int i=;i<=m;i++)
{
tmp=tmp*now%p;
if(mp[tmp])
{
return i*m-mp[tmp];
}
}
return -;
}
int a,b,x1,t;
signed main()
{
int cas;
scanf("%lld",&cas);
while(cas--)
{
scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t);
if(x1==t)
{
puts("");
continue;
}
if(a==)
{
if(x1==t)puts("");
else if(b==t)puts("");
else puts("-1");
continue;
}
if(a==)
{
if(!b)
{
if(x1==t)puts("");
else puts("-1");
continue;
}
exgcd(b,p);
int tmp=(t-x1+p)%p;
xx=((xx*tmp%p)+p)%p;
xx++;
printf("%lld\n",xx);
}
else
{
int c=pw(a-,p-);
int t1=(x1+b*c)%p,t2=p,t3=(b*c+t)%p;
exgcd(t1,t2);
xx=(xx%p+p)%p;
xx=(xx*t3)%p;
int ans=work(a,xx);
if(ans!=-)printf("%lld\n",ans+);
else printf("%lld\n",ans);
}
}
return ;
}

bzoj 3122 : [Sdoi2013]随机数生成器 BSGS的更多相关文章

  1. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

    Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...

  2. bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)

    Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.    接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...

  3. bzoj 3122: [Sdoi2013]随机数生成器【BSGS】

    题目要求的是: \[ ...a(a(a(ax+b)+b)+b)+b...=a^nx+a^{n-1}b+a^{n-2}b+...+b\equiv t(mod\ p) \] 后面这一大坨看着不舒服,所以考 ...

  4. bzoj 3122: [Sdoi2013]随机数生成器

    #include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...

  5. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  6. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  7. BZOJ3122: [Sdoi2013]随机数生成器(BSGS)

    题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...

  8. 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用

    题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...

  9. [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列

    题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...

随机推荐

  1. 虚拟机中安装MAC OS X教程(适用所有电脑方法,特别是cpu不支持硬件虚拟化的电脑)

    前言 之前写了一篇在Windows上搭建Object-C开发环境,并且写了一个HelloWorld程序.但真正开发苹果软件是在MAC OS X系统中(以下简称OSX)中.买不起MacBook,也没有O ...

  2. FinTech领域实践:乐维监控助力西南某上市城商行IT运维转型升级!

    FinTech领域实践:乐维监控助力西南某上市城商行IT运维转型升级! 项目背景 随着信息化的逐步深入,企业业务运营活动对IT的依赖程度越来越高,传统的局部.粗放.碎片化的IT运维管理模式已经无法满足 ...

  3. impala 使用记录

    在命令行里面直接输入类似下面的语句,就可以执行impala sql语句. impala-shell -q "select * from xxxc limit 10;" 当用pyth ...

  4. HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)

    中文题,题意就不说了 一开始接触树状数组时,只知道“单点更新,区间求和”的功能,没想到还有“区间更新,单点查询”的作用. 树状数组有两种用途(以一维树状数组举例): 1.单点更新,区间查询(即求和) ...

  5. Scrum立会报告+燃尽图(Final阶段第四次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481 项目地址:https://coding.net/u/wuyy694 ...

  6. learning of a previous team

     作为一个软件工程团队,离不开下面三个要素:支持,即分享.责任和合作. 分享是出色技术团队的另一个关键要素,它是团队的基石之一.只有通过分享,团队才有可能实现1+1 > 2这种效应,分享也是让团 ...

  7. WebService有什么用?

    入门之前先简单介绍下WCF.在用WebService做开发时,很多人都不知道WCF和WebService之间的关系.实际上WCF包含了WebService,这是一个很强悍的通信技术应用框架.微软把.N ...

  8. Leetcode题库——31.下一个排列

    @author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...

  9. 剑指offer:替换空格

    题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 一开始没理解,函数中 ...

  10. HDU 1003 最大连续子段和

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others)M ...