P3306 [SDOI2013] 随机数生成器 题解
题解
思路
由题目中可知:
\]
可以得出:
\]
其中 \(n+1\) 即所求的天数。
对于后面的那部分,我们联想到平方差公式和立方差公式:
a^2-1=(a-1)(a+1) \\
a^3-1=(a-1)(a^2+a+1)
\]
可以推广为:
\]
于是,我们将上式两边同时乘以 \(a-1\):
\]
观察到该式可以变形为 BSGS 的标准形式:
\]
这个式子看起来十分复杂,所以让我们换元,方便下文叙述。预备——换
令 \(c=(a-1)x_1+b\),\(d=(a-1)t+b\)。
于是上式变为:
\]
可以用 BSGS 求解。
注意求出来的 \(n\) 要加一。
细节
这是本题的重要部分。
首先,当 \(x_1=t\) 时,第一天就读到了第 \(t\) 页,直接输出 \(1\)。
其次,当 \(a=0\) 时,从第二天开始每天都读第 \(b\) 页。如果 \(b=t\) 那么输出 \(2\),否则输出 \(-1\)。
再其次,当 \(c\equiv0\pmod{p}\) 时,每天读的都是第 \(x_1\) 页。而既然能够走到这步,那么第一天就读不到第 \(t\) 页。因此输出 \(-1\)。
最后,当 \(a=1\) 时,代入式子可得:
\]
使用 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);
\]
P3306 [SDOI2013] 随机数生成器 题解的更多相关文章
- 洛咕 P3306 [SDOI2013]随机数生成器
洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...
- P3306 [SDOI2013]随机数生成器
思路:\(BSGS\) 提交:\(1\)次 题解: 原式可以化为\[x_{i+1}+\frac{b}{a-1}=a(x_{i}+\frac{b}{a-1})\mod p\] 这不是等比数列吗? \[x ...
- 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 ...
- 洛谷P3306 [SDOI2013]随机数生成器(BSGS)
传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判
[BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b, ...
- bzoj3122 [SDOI2013]随机数生成器
bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...
- 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS
[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t n=1 当 a=1 当 a=0 判断b==t /* http: ...
- 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)
题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...
- bzoj 3122 : [Sdoi2013]随机数生成器 BSGS
BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...
随机推荐
- MySQL中INSERT INTO ... ON DUPLICATE KEY UPDATE浅析
最近在做一个阅读次数的需求的时候,有这样一个场景,如果数据库中没有数据,就进行INSERT操作,有数据的话,阅读次数就+1.此处有两种实现方式,一种是想将数据查出来,在Java中进行处理,没有就INS ...
- vmware ESXi快速创建新的虚拟机
准备工作:新虚拟机Win10 安装后,需要windows update,更新补丁到最新,关机.(本文案例win10-Amadeus) 在数据盘新建Win10-Users文件夹(可自定义) 复制win ...
- 如何使用对象存储 COS ?七个步骤,帮你搞定!
导语:本文将介绍新手如何使用对象存储 COS,主要面向小白用户,旨在快速带领用户了解 COS 的优势.功能.费用.接口及控制台指南. 01 什么是对象存储 腾讯云对象存储 COS(Cloud Obje ...
- node-koa2 微信支付-企业付款到银行卡
微信支付用的V2版本 微信支付说明文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay_yhk.php?chapter=24_2 参数详细 ...
- 【Java】【SpringBoot】CP03:热部署
This article is written by Xrilang(Chinese Name:萌狼蓝天) If you want find me ,You can contact me in Bil ...
- java中基于swing库自定义分页组件
一个swing的分页组件,代码见附件. //用法如下: Class Test{ JTable table ; StatusBar statusBar ; Test(){ ...
- Web端即时通讯实践干货:如何让WebSocket断网重连更快速?
本文作者网易智慧企业web前端开发工程师马莹莹.为了提升内容质量,收录时有修订和改动. 1.引言 在一个完善的即时通讯IM应用中,WebSocket是极其关键的一环,它为基于Web的即时通讯应用提供了 ...
- 飞书lark机器人 自动化发版
飞书lark机器人 自动化发版 #1 介绍 开发飞书机器人接收消息并调用构建接口, 实现自动化发版 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部署 jenk ...
- 在 Development 环境下依赖注入的行为可能有所不同
奇怪的问题 本周被一个奇怪的问题困扰了一天.事情的起因是这样的:在某个 PR 合并后,我拉了最新代码,但是在我本地F5调试始终报错.示例代码如下: public interface Interface ...
- python创建项目虚拟环境
创建一个文件夹用于存放你的虚拟环境 cd 到存放虚拟环境的地址 安装虚拟环境库: pip3 install virtualenv 创建虚拟环境:python3 -m venv 环境名称 激活虚拟环境: ...