传送门

题解

思路

由题目中可知:

\[\large x_i \equiv ax_{i-1}+b\pmod{p}
\]

可以得出:

\[\large t=x_{n+1} \equiv a^nx_1+b \sum_{i=0}^{n-1}a^i\pmod{p}
\]

其中 \(n+1\) 即所求的天数。

对于后面的那部分,我们联想到平方差公式和立方差公式:

\[\large
a^2-1=(a-1)(a+1) \\
a^3-1=(a-1)(a^2+a+1)
\]

可以推广为:

\[\large a^n-1=(a-1)\sum_{i=0}^{n-1}a^i
\]

于是,我们将上式两边同时乘以 \(a-1\):

\[\large (a-1)t\equiv (a-1)x_1a^n+b(a^n-1)\pmod{p}
\]

观察到该式可以变形为 BSGS 的标准形式:

\[\large a^n\equiv[(a-1)t+b][(a-1)x_1+b]^{-1}\pmod{p}
\]

这个式子看起来十分复杂,所以让我们换元,方便下文叙述。预备——换

令 \(c=(a-1)x_1+b\),\(d=(a-1)t+b\)。

于是上式变为:

\[\large a^n\equiv c^{-1}d\pmod{p}
\]

可以用 BSGS 求解。

注意求出来的 \(n\) 要加一。

细节

这是本题的重要部分。

首先,当 \(x_1=t\) 时,第一天就读到了第 \(t\) 页,直接输出 \(1\)。

其次,当 \(a=0\) 时,从第二天开始每天都读第 \(b\) 页。如果 \(b=t\) 那么输出 \(2\),否则输出 \(-1\)。

再其次,当 \(c\equiv0\pmod{p}\) 时,每天读的都是第 \(x_1\) 页。而既然能够走到这步,那么第一天就读不到第 \(t\) 页。因此输出 \(-1\)。

最后,当 \(a=1\) 时,代入式子可得:

\[\large t\equiv x_1+bn\pmod{p}
\]

使用 exgcd 求解。

关于求 \(c\) 的逆元,由于 \(p\) 是质数,且经过上述分类讨论,\(c\not\equiv0\pmod{p}\),因此 \(c\) 与 \(p\) 一定互质。可以使用快速幂法和 exgcd 求解。

既然我们在讨论 \(a=1\) 时使用了 exgcd,那么使用 exgcd 更好。但是笔者一开始没讨论 \(\sout{a=1}\),所以用的快速幂。

为什么 markdown 的分割线对 \(\sout{\LaTeX}\) 不生效

实现

上面说得差不多了。注意中间量开long long

代码

快速幂和 exgcd:

int qpow(int x,int y,int p)
{
int ret=1;
while(y)
{
if(y&1) ret=1ll*ret*x%p;
x=1ll*x*x%p,y>>=1;
}
return ret;
}
int exgcd(int p,int q,int &x,int &y)
{
if(!q)
{
x=1,y=0;
return p;
}
int ret=exgcd(q,p%q,y,x);
y-=(p/q)*x;
return ret;
}

BSGS:

std::unordered_map<int,int> mp;
int BSGS(int a,int s,int p)
{
mp.clear();
int len=ceil(sqrt(p)),tmp=1;
for(int i=0;i<len;i++)
{
mp[1ll*tmp*s%p]=i;
tmp=1ll*tmp*a%p;
}
int base=1;
for(int i=0;i<=len;i++)
{
if(mp.find(base)!=mp.end())
if(1ll*i*len-mp[base]>=0)
return 1ll*i*len-mp[base];
base=1ll*base*tmp%p;
}
return -2; //因为要+1
}

注意多测。

主体部分:

int p,a,b,x,t;
scanf("%d%d%d%d%d",&p,&a,&b,&x,&t);
if(x==t)
{
printf("1\n");
continue;
}
if(a==0)
{
printf("%d\n",b==t?2:-1);
continue;
}
if(a==1)
{
int tmp=t-x;
int tx,ty;
int gcd=exgcd(b,p,tx,ty);
if(tmp%gcd)
printf("-1\n");
else
printf("%d\n",(1ll*tx*tmp/gcd%p+p)%p+1);
continue;
}
int c=(1ll*(a-1)*x+b)%p,d=(1ll*(a-1)*t+b)%p;
if(!c)
{
printf("-1\n");
continue;
}
d=1ll*d*qpow(c,p-2,p)%p;
printf("%d\n",BSGS(a,d,p)+1);

\[\Huge End
\]

P3306 [SDOI2013] 随机数生成器 题解的更多相关文章

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

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

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

    思路:\(BSGS\) 提交:\(1\)次 题解: 原式可以化为\[x_{i+1}+\frac{b}{a-1}=a(x_{i}+\frac{b}{a-1})\mod p\] 这不是等比数列吗? \[x ...

  3. P3306 [SDOI2013]随机数生成器(bzoj3122)

    洛谷 bzoj 特判+多测真恶心 . \(0\le a\le P−1,0\le b\le P−1,2\le P\le 10^9\) Sample Input 3 7 1 1 3 3 7 2 2 2 0 ...

  4. 洛谷P3306 [SDOI2013]随机数生成器(BSGS)

    传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...

  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]随机数生成器

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

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

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

  9. 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)

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

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

    BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...

随机推荐

  1. Three.js入门-常见几何体

    这章节,我们将介绍 Three.js 中常见的几何体(Geometry),包括立方体.球体.圆柱体.平面.圆环.圆锥体等.几何体是构建 3D 模型的基础元素,通过不同的几何体可以创建出各种形状的物体. ...

  2. CSS 变量与运算

    1.变量 变量声明:变量名使用 "--" 为前缀,且区分大小写 /* 全局变量 */ :root{ --bgColor: red; } /* 布局变量 */ p{ --bgColo ...

  3. Flutter之GetX之路由管理

    GetX之路由管理 GetX有一套完整的路由管理,并且不需要context上下文,API非常简洁 直接导航 导航到新的页面 Get.to(NextScreen()); 返回,此方法可以用于关闭Snac ...

  4. 配合 envoy 使用 Zipkin

    use zipkin in envoy document: https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/zipkin.htm ...

  5. Jackson ObjectMapper - 指定对象属性的序列化顺序

    注释很有用,但在任何地方应用起来都会很痛苦.您可以配置整个 ObjectMapper 以这种方式工作 当前杰克逊版本: objectMapper.configure(MapperFeature.SOR ...

  6. Qt血的教训/细数Qt开发的各种坑/又爱又恨/欢迎围观留言评论

    一.吐槽总结 搞Qt开发十几年了,最初从Qt4.6开始,一直追新到现在的6.7版本,中间经历过无数的血的教训,简直是又爱又恨.其实Qt挺好的,但是还是要忍不住吐槽一下,本人还是希望Qt发展的越来越好, ...

  7. Qt编写地图综合应用46-设备点位(添加、删除、清空、重置)

    一.前言 在学习JS语法的时候发现其实程序都大同小异,正所谓一通百通,熟悉各大概的语法以后基本都可以上手,和C++最大的不同就是他没有数据类型的概念,作为解释性的语言,是在执行的时候自动去转换数据类型 ...

  8. 在Node.js环境下使用npm命令安装OpenLayers6.4.3时,提示错误“rollbackFailedOptional: verb npm-session”的解决办法

    该问题一般情况是因为npm源问题. 更换为淘宝的源: npm config set registry http://registry.npm.taobao.org 使用  npm info expre ...

  9. [转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法

    常见的java调用python脚本方式 通过jython提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 通过jython提供的类库实现 通过jython实现的话,我 ...

  10. shell脚本检查192.168.1网段ip是否在用

    要检查 192.168.1 网段中哪些 IP 地址正在使用,可以使用 Shell 脚本结合 ping 命令来扫描整个网段.以下是实现这一功能的完整脚本: 脚本:检查 192.168.1 网段 IP 是 ...