博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「Luogu3306」[SDOI2013]随机数生成器
阅读量:6921 次
发布时间:2019-06-27

本文共 1191 字,大约阅读时间需要 3 分钟。

「Luogu3306」[SDOI2013]随机数生成器

Solution

我们来回忆一下数列递推公式求通项的方法

\(Y_i=X_i+\frac{b}{a-1}\),则有

\[Y_i=aY_{i-1}\Rightarrow Y_i=a^{i-1}Y_1\]

于是题目转化为求解方程

\[t+\frac b{a-1}\equiv a^{x-1}(X_1+\frac b{a-1})\pmod p\]

\[\Rightarrow a^{x-1}\equiv\frac{t+\frac b{a-1}}{X_1+\frac b{a-1}}\pmod p\]

好的,这个东西我们只要用BSGS就可以了

End?


几个细节:

\(X_1=t\)时,直接输出\(1\)

\(a=0\)时,输出若\(b=t\)则输出\(2\),否则无解,\(X_1=t\)的情况已经特判

\(a=1\)时,方程实际上为

\[(x-1)b\equiv t-X_1\pmod p\]

根据裴蜀定理判掉无解,然后直接算\(x-1\)即可

需要注意的是如果\(\frac{t-X_1} b=p\),则不需要取模直接输出

True End

Code

#include 
#include
#include
#include
#include
#include
#include
#define mp(x,y) (make_pair((x),(y)))#define inv(x) (fastpow((x),p-2))using namespace std;typedef long long ll;template
void read(T &t){ t=0;int f=0;char c=getchar(); while(!isdigit(c)){f|=c=='-';c=getchar();} while(isdigit(c)){t=t*10+c-'0';c=getchar();} if(f)t=-t;}int T;ll p,a,b,X1,t;ll m;ll fastpow(ll a,ll b){ ll re=1,base=a; while(b) { if(b&1) re=re*base%p; base=base*base%p; b>>=1; } return re;}map
rec;void Pre(){ rec.clear(); ll tmp=1; for(register int i=0;i

转载于:https://www.cnblogs.com/lizbaka/p/10656151.html

你可能感兴趣的文章
VC开发多语言界面支持的简单方法
查看>>
常用SQL语句实例 10
查看>>
JAVA内存机制
查看>>
办公软件之excel打印时打印区域与纸张不符解决方法
查看>>
Lync 小技巧-21-通过Google浏览器加入微软Lync 2013会议
查看>>
SFB 项目经验-03-共存迁移-Lync 2013-TO-SFB 2015-完成
查看>>
《企业云桌面实施》-小技巧-2017-10-29
查看>>
nodejs http 跨域返回解决办法
查看>>
C语言练习1_大数据的简单运算
查看>>
Javascript第三记--语法基础
查看>>
ubuntu使用笔记
查看>>
xshell使用密钥登录linux服务器
查看>>
学习Python第一天!(2)
查看>>
理不清的网络基础知识(00)
查看>>
在Oracle 11g中用看Oracle的共享内存段---------IPCS
查看>>
如何提高PUE值 数据中心能耗详解
查看>>
我的友情链接
查看>>
hibernateTemplate类的使用-总结
查看>>
PHP生成随机的HTML颜色代码
查看>>
python最简单的发邮件方式(不带附件)
查看>>