题目

来画柿子吧

我们要求的是

\[f(x)\equiv t(mod\ \ p)
\]

其中\(f(1)=x_0,f(x)=af(x-1)+b\)

我们来写几项柿子看看

\[f(1)=x_0
\]

\[f(2)=ax_0+b
\]

\[f(3)=a(ax_0+b)+b=a^2x_0+ab+b
\]

\[f(4)=a^3x_0+a^2b+ab+b
\]

我们发现好像后面就是一个等比数列求和啊

于是我们甚至可以搞出一个通项来

于是

\[f(x)=a^{x-1}x_0+b\sum_{i=0}^{x-2}a^i
\]

显然后面那个东西就是\(\frac{a^{x-1}-1}{a-1}\)

所以

\[f(x)=a^{x-1}x_0+\frac{b\times a^{x-1}-b}{a-1}
\]

干脆设\(k=x-1\)

\[f(x)=\frac{a^kx_0(a-1)+b\times a^k-b}{a-1}=\frac{a^k(ax_0-x_0+b)-b}{a-1}
\]

所以我们现在的方程是

\[\frac{a^k(ax_0-x_0+b)}{a-1}-\frac{b}{a-1}\equiv t(mod\ p)
\]

我们设

\[inv=inv(\frac{ax_0-x_0+b}{a-1},p)
\]

所以现在变成了

\[a^k\equiv (t+\frac{b}{a-1})\times inv(mod\ \ p)
\]

所以这不就是\(bsgs\)板子了吗,\(k+1\)就是答案了

注意特判掉\(a=1\)以及\(x_0=t\)的情况

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<tr1/unordered_map>
#define re register
#define LL long long
using namespace std::tr1;
unordered_map<LL,LL> ma;
int T;
LL P,a,b,x0,t;
void exgcd(LL a,LL b,LL &x,LL &y) {if(!b) {x=1,y=0;return;} exgcd(b,a%b,y,x);y-=a/b*x;}
inline LL quick(LL a,LL b) {LL S=1;while(b) {if(b&1) S=S*a%P; b>>=1; a=a*a%P;} return S;}
inline void bsgs()
{
if(x0==t) {puts("1");return;}
if(a==0) {if(b==t) puts("2");else puts("-1"); return;}
if(a==1&&!b) {puts("-1");return;}
if(a==1&&b)
{
t=t-x0; t=(t%P+P)%P;
LL x,y;
exgcd(b,P,x,y); x=(x*t%P+P)%P;
printf("%lld\n",x+1); return;
}
ma.clear();
if(a%P==0) {puts("-1");return;}
LL inv=(a*x0%P-x0+b)%P; inv=(inv+P)%P;
LL x,y; exgcd(a-1,P,x,y); x=(x%P+P)%P; t=t+(b*x)%P; t%=P;inv=inv*x%P;
exgcd(inv,P,x,y);
x=(x%P+P)%P;
t=t*x%P;
LL now=1;
LL m=ceil(std::sqrt(P+1));
for(re int i=0;i<=m;i++) ma[now*t%P]=i,now=now*a%P;
LL S=quick(a,m);now=S;
for(re int i=1;i<=m;i++)
{
if(ma.find(now)!=ma.end())
{LL ans=(LL)i*(LL)m-ma[now];printf("%lld\n",ans+1);return;}
now=now*S%P;
}
puts("-1");
}
int main()
{
scanf("%d",&T);
while(T--) scanf("%lld%lld%lld%lld%lld",&P,&a,&b,&x0,&t),bsgs();
return 0;
}

【[SDOI2013]随机数生成器】的更多相关文章

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

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

  2. bzoj3122 [SDOI2013]随机数生成器

    bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...

  3. 洛咕 P3306 [SDOI2013]随机数生成器

    洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...

  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. 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)

    题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...

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

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

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

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

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

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

  10. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

随机推荐

  1. 设计模式学习总结(十)责任链模式(Chain Of Responsibility)

    责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发!   一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...

  2. python 爬虫系列01-连接mysql

    爬虫学习中......................................... import pymysql conn = pymysql.connect(host=',database ...

  3. IDEA 中tomcat启动问题时,一直出去发布状态,无法加载项目

    解决方法:排查clean.build之前添加的xml中的sql语句,发现sql多写了一个逗号,导致无法加载项目.修改完sql,就可以跑了.

  4. Zookeeper概念学习系列之zookeeper是什么?

    1. Zookeeper是Hadoop的分布式协调服务. 2. 分布式应用程序可以基于它,来实现同步服务,配置维护和命名服务等. 3. zookeeper可以保证数据在zookeeper集群之间的数据 ...

  5. 016-hibernateutils模板

    package ${enclosing_package}; import org.hibernate.HibernateException; import org.hibernate.Session; ...

  6. 1个示例 学会 mvc 常用标签

    HtmlHelper用法大全3:Html.LabelFor.Html.EditorFor.Html.RadioButtonFor.Html.CheckBoxFor  @Html.***For:为由指定 ...

  7. C#基础知识-引用类型和值类型的区别(六)

    在第一篇中我们介绍了C#中基本的15种数据类型,这15种数据类型中又分为两大类,一种是值类型,一种是引用类型.值类型有sbyte.short.long.int.byte.ushort.uint.ulo ...

  8. js【jquery】 - DOM操作

    1.修改元素样式 js方式: var div2 = document.getElementById("") div2.style.width = '200px'; div2.cla ...

  9. C#中TransactionScope的使用方法和原理(摘)

    出自51CTO博客:http://cnn237111.blog.51cto.com/2359144/1271600 在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务 ...

  10. c#winform循环播放多个视频

    环境: vs2015 +winform 首先,vs自带组件很方便,所以,用windowMediaplayer组件,如果做单曲循环播放的话,加个属性: axWindowsMediaPlayer1.set ...