根据鸽笼原理,在p次后一定循环,一眼BSGS。
发现他给的函数是个一次函数,一次函数有什么性质呢?f(f(x))还是一次函数,这样就能做了。
首先我们暴力预处理出f(f(f(x)))......sqrt(p)层的f(x)。
然后预处理出前sqrt(p)迭代后的值。
我们可以用exgcd求出如果让f(x)=t,我们需要的x值。
然后我们枚举用多少层迭代sqrt(p)后的f(x)即可。
注意特判一下a==0的情况,因为exgcd无法处理有0的参数。
为什么跑得如此之慢?可能我需要一个unordered_map,然而C++11不能用......

代码:

 #include<cstdio>
#include<cmath>
#include<map>
typedef long long int lli;
using namespace std; lli mod; struct Poly {
lli k,b;
inline Poly inter(const Poly &t) {
return (Poly){t.k*k%mod,(t.b*k%mod+b)%mod};
}
inline lli ite(const lli &x) {
return ( k * x % mod + b ) % mod;
}
}now,trans,sqr; inline lli exgcd(lli a,lli b,lli &x,lli &y) {
if( !b ) {
x = , y = ;
return a;
}
lli ret = exgcd(b,a%b,y,x);
y -= ( a / b ) * x;
return ret;
} inline lli getx(const Poly &p,const lli &t) {
lli x,y,rit;
exgcd(p.k,mod,x,y);
rit = ( t - p.b + mod ) % mod , x = ( x % mod + mod ) % mod;
return x * rit % mod;
} inline lli bsgs(lli a,lli b,lli x,lli t) {
if( !a && !b ) return x == t ? : -;
map<lli,lli> mp;
int sq = ( (double) sqrt(mod) + 0.5 ) + ;
sqr = now = (Poly){,} , trans = (Poly){a,b};
for(int i=;i<=sq;i++) {
if( mp.find(x) == mp.end() ) mp[x] = i;
x = trans.ite(x);
}
for(int i=;i<=sq;i++) sqr = trans.inter(sqr);
for(int i=;i<=sq;i++) {
lli tx = getx(now,t);
if( mp.find(tx) != mp.end() ) return mp[tx] + i * sq;
now = sqr.inter(now);
}
return -;
} int main() {
static int T;
static lli a,b,x,t;
scanf("%d",&T);
while(T--) {
scanf("%lld%lld%lld%lld%lld",&mod,&a,&b,&x,&t);
printf("%lld\n",bsgs(a,b,x,t));
}
return ;
}

Bzoj3122:多项式BSGS的更多相关文章

  1. BSGS[bzoj2242][bzoj3122]

    数论题. 操作一:直接快速幂就好了. 操作二:我用了exgcd,shy和lyz都喜欢欧拉函数...QAQ最后这块还写错了. 对于ax+by=gcd(a,b)的形式,我们可以把他们变成y'x+p'y=1 ...

  2. P5277 【模板】多项式开根(加强版)(bsgs or Cipolla)

    题面 传送门 题解 首先你得会多项式开根->这里 其次你得会解形如 \[x^2\equiv a \pmod{p}\] 的方程 这里有两种方法,一个是\(bsgs\)(这里),还有一种是\(Cip ...

  3. 【BZOJ3122】随机数生成器(BSGS,数论)

    [BZOJ3122]随机数生成器(BSGS,数论) 题面 BZOJ 洛谷 题解 考虑一下递推式 发现一定可以写成一个 \(X_{i+1}=(X_1+c)*a^i-c\)的形式 直接暴力解一下 \(X_ ...

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

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

  5. 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

    [bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t /* http: ...

  6. 【BZOJ-3122】随机数生成器 BSGS

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Sta ...

  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. 风控模型-美国FICO标准

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  2. Java模拟http请求远程调用接口工具类

    package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...

  3. Spark记录-Scala shell命令

    1.scala shell命令 scala> :help All commands can be abbreviated, e.g., :he instead of :help. :edit & ...

  4. SQL记录-PLSQL日期与时间

    PL/SQL日期及时间 PL/SQL提供两个日期和时间相关的数据类型: 日期时间(Datetime)数据类型 间隔数据类型 datetime数据类型有: DATE TIMESTAMP TIMESTAM ...

  5. nodejs读取json文件,写入mongodb数据库

    最近又一点时间,开始使用mongodb存储json模型文件,然后可以实现模型文件的在线编辑和管理.今天上午实现了json文件入库的代码,如下: var fs=require("fs" ...

  6. 机器学习算法整理(七)支持向量机以及SMO算法实现

    以下均为自己看视频做的笔记,自用,侵删! 还参考了:http://www.ai-start.com/ml2014/ 在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A还 ...

  7. Java SpringMVC框架学习(三)springMVC的执行流程

    具体执行逻辑如下: 浏览器提交请求到中央调度器. 中央调度器将请求转给处理器映射器. 处理器映射器根据请求, 找到请求对应的处理器, 并将其封装为处理器执行链返回给中央调度器. 中央调度器根据处理器执 ...

  8. 【windows核心编程】HideProcess

    A Basic Windows DKOM Rootkit Pt 1 https://www.landhb.me/posts/v9eRa/a-basic-windows-dkom-rootkit-pt- ...

  9. python的map/reduce区别

    直接上列子 map: 把f(x)作用在list的每一个元素并把结果生成一个新的list” # coding=utf-8def f(x): return x * x r = map(f, [1, 2, ...

  10. 微信小程序调用接口返回数据或提交数据

    由于小程序发起网络请求需要通过 wx.request 文档地址 https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html 习 ...