bzoj3122 [SDOI2013]随机数生成器
给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\)
求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\)
\(0\leq a,\ b,\ t,\ P\leq10^9,\ P\) 为质数
BSGS
首先化式子,推得
\]
因此
\]
所以上 \(BSGS\)
然而这题特判很恶心,不加特判 \(0\text{pts}\)
特判如下:
- \(x=t:ans=1\)
- \(a=1\)
- \(b=0:ans=-1\)
- \(b\neq0:ans=\frac{t-x}{b}+1\)
- \(a=0\)
- \(b=t:ans=2\)
- \(b\neq t:ans=-1\)
时间复杂度 \(O(T\sqrt P)\)
代码
#include <bits/stdc++.h>
using namespace std;
int P;
int qp(int a, int k) {
int res = bool(a);
for (; k; k >>= 1, a = 1ll * a * a % P) {
if (k & 1) res = 1ll * res * a % P;
}
return res % P;
}
int bsgs(int a, int b) {
if (!a && b) return -1;
map <int, int> s;
int sz = sqrt(P), inv_a = qp(a, P - 2), pw = qp(a, sz), cur = 1;
for (int i = 0; i <= sz; i++) {
s.insert(make_pair(1ll * b * cur % P, i)), cur = 1ll * cur * inv_a % P;
}
cur = 1;
map <int, int> :: iterator it;
for (int i = 0; i <= sz; i++, cur = 1ll * cur * pw % P) {
if ((it = s.find(cur)) != s.end()) {
return i * sz + (it -> second);
}
}
return -1;
}
int main() {
int Tests, a, b, x, t, A, B;
scanf("%d", &Tests);
while (Tests--) {
scanf("%d %d %d %d %d", &P, &a, &b, &x, &t);
a %= P, b %= P, x %= P, t %= P;
if (x == t) {
puts("1"); continue;
} else if (a == 1) {
if (!b) {
puts("-1"); continue;
}
printf("%d\n", 1ll * (t - x + P) * qp(b, P - 2) % P + 1);
continue;
} else if (!a) {
puts(b == t ? "2" : "-1");
continue;
}
A = a, B = 1ll * (1ll * a * t - t + b + P) % P * qp((b - x + 1ll * a * x + P) % P, P - 2) % P;
int ans = bsgs(A, B);
printf("%d\n", ~ans ? ans + 1 : ans);
}
return 0;
}
bzoj3122 [SDOI2013]随机数生成器的更多相关文章
- BZOJ3122: [Sdoi2013]随机数生成器(BSGS)
题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...
- bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...
- [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列
题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...
- BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】
题目 输入格式 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 输出 ...
- 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判
[BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b, ...
- 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS
[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t n=1 当 a=1 当 a=0 判断b==t /* http: ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- 洛咕 P3306 [SDOI2013]随机数生成器
洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...
随机推荐
- springboot情操陶冶-web配置(六)
本文则针对数据库的连接配置作下简单的分析,方便笔者理解以及后续的查阅 栗子当先 以我们经常用的mybatis数据库持久框架来操作mysql服务为例 环境依赖 1.JDK v1.8+ 2.springb ...
- 痞子衡嵌入式:第一本Git命令教程(7.1)- 清理之缓存(stash)
今天是Git系列课程第七课,上一课我们学会了查看Git本地历史提交,今天痞子衡要讲的是Git仓库的清理操作,一共4个命令,都是日常开发中非常实用的命令,掌握这4个命令,会让你有一种玩弄Git仓库于股掌 ...
- Mybatis源码之StatementType
在mybatis中StatementType的值决定了由什么对象来执行我们的SQL语句.本文来分析下在mybatis中具体是怎么处理的. StatementType 1.StatementType ...
- C# 常用小点
1]创建文件夹 //相对路径 string FilePath = Server.MapPath("./") + "ImageFile/Images/" + Da ...
- Windows 10 安装 ElasticSearch
Java环境准备 可以下载oracle最新的JDK,作为C#程序员,支持一下微软的Mobile OpenJDK,构建一下Java环境. 微软的OpenJDK是针对Xamarin.Android的SDK ...
- 解决ajaxfileupload上传文件在IE浏览器返回data为空问题
关于ajaxfileupload,建议还是别用,已经没有人维护的脚本了,笔者就是入了这个坑. 在IE浏览器中ajaxfileupload返回data为空 jq.ajaxFileUpload ( { u ...
- C++系列总结——new和delete
前言 "new和malloc()有什么区别",这是一个很常见的C++面试题.我的回答是"new等于malloc()后再选择性执行构造函数".执行流程上是这样的, ...
- 老王说JavaDoc
开场白说点东西: { 抓住客户的痛点.痒点.爽点,提出我们产品的核心价值. 产品定位 技术架构 以微服务为核心的前后端分离,业务积木装配式技术架构.传感器采集,物联网+互联网转换,大数据分布式.存储. ...
- bitset用法小结
bitset bitset大概就是类似于bool数组一样的东西 但是它的每个位置只占1bit(特别特别小) bitset的原理大概是将很多数压成一个,从而节省空间和时间(暴力出奇迹) 一般来说bits ...
- selenium chrome在新标签页打开链接的方法
目前chrome是我在实现webdriver时运行最稳定的浏览器,如何利用webdriver打开多个标签页和链接呢,到处查找得到的往往只是如何打开标签页.打开标签页很简单,chrome浏览器打开标签页 ...