[bzoj 3122] [Sdoi2013]随机数生成器:数论,同余,分类讨论,BSGS
来源:互联网 发布:做报表的软件 编辑:程序博客网 时间:2024/06/06 05:38
题意:给四个参数p, a, b, x1,生成一个数列,以x1为首项,x[i+1] = (ax[i]+b) mod p (i>=1),问是否存在x[i]=t,如果存在,求出最小的i。0<=a, b, x1, t < p,2<=p<=10^9,p为素数。
以前看过这道题,知道思路。然而AC还是不太容易啊……
如果这是数学试卷上的一道数列大题,如果递推式不mod p,作为高中生的我们会求一求通项,解一个方程。
现在,这是一道OI题,每次mod p——但这并不妨碍我们求通项,因为同余号和等号具有许多一致之处。
求一求特征根,先不急着做除法,得到
即便p是素数,也要考察
当
容易写出通项
当
通项公式
通项求完了,让我们来解方程。
令
且
当
若
若
当
数列首项为
当
若
若
关于大步小步算法,请听下回分解~
综上所述,我们要考察a是否为1或0。若a=1,考察b是否为0。若a!=1且a!=0,考察(x1+b*inv(a-1))%p是否为0。
不单独考察a=0也可以,这要求在BSGS过程中特判a^0=1。但是0^0感觉有点怪怪的……
#include <cstdio>#include <cmath>#include <map>using namespace std;typedef long long ll;ll p;inline ll fast_exp(ll x, ll n){ ll z = 1; for (ll y = x; n; n >>= 1, y = y*y%p) if (n & 1) z = z*y%p; return z; }inline ll inv(ll x){ return fast_exp(x, p-2);}ll bsgs(ll a, ll y) // minimum x such that a^x mod p = y{ ll m = sqrt(p); map<ll, ll> M; for (ll i = 1, t = a*y%p; i <= m; ++i, t = t*a%p) M[t] = i; for (ll i = m, b = fast_exp(a, m), t = b; i-m < p-1; i += m, t = t*b % p) if (M.count(t)) return i-M[t]; return -2;}int main(){ int T; ll a, b, x1, t; for (scanf("%d", &T); T--; ) { scanf("%lld %lld %lld %lld %lld", &p, &a, &b, &x1, &t); ll ans = -1; if (a == 0) ans = x1 == t ? 1 : (b == t ? 2 : -1); else if (a == 1) { if (b) { ans = ((t-x1+p)%p*inv(b)+1)%p; ans = ans ? ans : p; } else ans = x1 == t ? 1 : -1; } else { ll c = b*inv(a-1)%p, d = (x1+c)%p; if (d) ans = bsgs(a, (t+c)*inv((x1+c)%p)%p) + 1; else ans = (t+c)%p ? -1 : 1; } printf("%lld\n", ans); } return 0;}
0 0
- [bzoj 3122] [Sdoi2013]随机数生成器:数论,同余,分类讨论,BSGS
- BZOJ-3122-随机数生成器-SDOI2013-BSGS
- BZOJ 3122 [Sdoi2013]随机数生成器 BSGS
- BZOJ 3122: [Sdoi2013]随机数生成器 ex_gcd+BSGS
- Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
- BZOJ 3122 SDOI2013 随机数生成器 数论 EXBSGS
- BZOJ 3122([Sdoi2013]随机数生成器-同余方程+负数逆元)
- BZOJ 3122([Sdoi2013]随机数生成器-同余方程+负数逆元)
- 【bzoj3122】[Sdoi2013]随机数生成器 BSGS
- bzoj 3122 [Sdoi2013]随机数生成器
- bzoj 3122 随机数生成器 (BSGS)
- BZOJ3122 [Sdoi2013]随机数生成器 数论
- 【BZOJ3122】【SDOI2013】随机数生成器(快速幂+BSGS)
- bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)
- 线性同余随机数生成器
- 纯线性同余随机数生成器
- 纯线性同余随机数生成器
- 纯线性同余随机数生成器
- 第十五周-统计字符串种类
- Jmeter学习笔记
- MacBook使用
- 判断最小生成树的唯一性
- 第十五周-C语言习题 字符串比较
- [bzoj 3122] [Sdoi2013]随机数生成器:数论,同余,分类讨论,BSGS
- HTTP与HTTPS协议介绍
- 笛卡尔树 中序遍历判断是否为二叉搜索树
- Spring boot + thymeleaf + Shiro 会话过期返回登录界面片段之解决方案
- 《我的人生哲学:马云献给年轻人的12堂人生智慧课》读后感
- 第十五周-包含B的字符串
- TCP三次握手过程
- jQuery 列表的修改和添加
- 【PHP】用unset销毁变量