题意:给你一个数列,a1 = x,ai = (A * ai-1 + B) % P,求第一个是t的是哪一项,或者永远不会有t。

解:循环节不会超过P。我们使用BSGS的思想,预处理从t开始跳√P步的,插入Hash表内。

然后每次把a1跳√P步,来看是否在Hash表中存在。

这样发现我们有40,WA了60分。为什么呢?考虑是否存在两个数x和y,它们跳一次之后一样了。发现这种情况只会出现在A = 0的时候,于是特判掉A = 0。可获得100分。

 #include <bits/stdc++.h>

 const int N = ;

 int MO, A, B, op, aim;

 inline int qpow(int a, int b) {
int ans = ;
while(b) {
if(b & ) {
ans = 1ll * ans * a % MO;
}
a = 1ll * a * a % MO;
b = b >> ;
}
return ans;
} namespace Hash {
struct Node {
int nex, v, id;
}node[N]; int tp;
const int mod = ;
int e[mod];
inline void clear() {
tp = ;
memset(e, , sizeof(e));
return;
}
inline void insert(int v, int id) {
int x = v % mod;
for(int i = e[x]; i; i = node[i].nex) {
if(node[i].v == v) {
node[i].id = id;
return;
}
}
node[++tp].nex = e[x];
node[tp].v = v;
node[tp].id = id;
e[x] = tp;
return;
}
inline int find(int v) {
int x = v % mod;
for(int i = e[x]; i; i = node[i].nex) {
if(node[i].v == v) {
return node[i].id;
}
}
return -;
}
} inline void solve() {
Hash::clear();
scanf("%d%d%d%d%d", &MO, &A, &B, &op, &aim);
if(op == aim) {
printf("%d\n", );
return;
}
if(A == ) {
if(B == aim) {
printf("2\n");
}
else {
printf("-1\n");
}
return;
}
int T = sqrt((double)MO);
for(int i = ; i < T; i++) {
Hash::insert(aim, i);
//printf("Hash insert %d %d \n", aim, i);
aim = (1ll * A * aim % MO + B) % MO;
}
int c = qpow(A, T), d;
if(A == ) {
d = 1ll * B * T % MO;
}
else {
d = (1ll * (c - ) * qpow(A - , MO - ) % MO * B % MO + MO) % MO;
}
//printf("c = %d d = %d \n", c, d);
for(int i = ; (i - ) * T < MO; i++) {
op = (1ll * op * c + d) % MO;
int t = Hash::find(op);
//printf("op = %d t = %d \n", op, t);
if(t != -) {
printf("%d\n", i * T - t + );
return;
}
}
printf("-1\n");
return;
} int main() {
int T;
scanf("%d", &T);
while(T--) {
solve();
}
return ;
}

AC代码

洛谷P3306 随机数生成器的更多相关文章

  1. 洛谷P3600 随机数生成器(期望dp 组合数)

    题意 题目链接 Sol 一条重要的性质:如果某个区间覆盖了另一个区间,那么该区间是没有用的(不会对最大值做出贡献) 首先不难想到枚举最终的答案\(x\).这时我们需要计算的是最大值恰好为\(x\)的概 ...

  2. [洛谷P5147]随机数生成器

    题目大意:$$f_n=\begin{cases}\frac{\sum\limits_{i=1}^nf_i}n+1&(n>1)\\0&(n=1)\end{cases}$$求$f_n ...

  3. 洛谷P3600随机数生成器——期望+DP

    原题链接 写到一半发现写不下去了... 所以orz xyz32768,您去看这篇题解吧,思路很清晰,我之前写的胡言乱语与之差距不啻天渊 #include <algorithm> #incl ...

  4. 洛谷 P3600 - 随机数生成器(期望 dp)

    题面传送门 我竟然独立搞出了这道黑题!incredible! u1s1 这题是我做题时间跨度最大的题之一-- 首先讲下我四个月前想出来的 \(n^2\log n\) 的做法吧. 记 \(f(a)=\m ...

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

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

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

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

  7. 洛谷 [P4035] 球形空间生成器

    高斯消元 注意浮点误差,判断一个浮点数是否为 0 的时候,看他的绝对值与 \(10^{-8}\)的关系 #include <iostream> #include <algorithm ...

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

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

  9. 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 ...

随机推荐

  1. 9个永恒的UI设计原则

    很多人都在寻找那些能够帮助他们快速提升设计能力的方法,但你是否想过,自己身上的哪些方面会对你的设计产生影响呢?是使用工具的技巧,对设计的理解和态度,还是你的生活习惯呢?我想说所有这些都是决定你的设计是 ...

  2. java笔试之提取不重复的整数

    输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 此题可以使用linkedHashedSet\ArrayList\Stack\数组等来做.类似题目是输入一个数/字符串,从 ...

  3. DbUtils要点小结

    一. DbUtils核心API 1. QueryRunner update方法 query方法 2. 各种Handler都实现ResultSetHandler接口 beanhandler beanli ...

  4. 接口测试——postman

    一.接口测试的准备工作 做接口测试之前需要有接口文档,请求参数,返回参数 二.使用postman进行接口测试 1.get请求 ①get请求可以直接在URL后面添加问号加参数,不需要使用工具来测试接口: ...

  5. csps模拟69chess,array,70木板,打扫卫生题解

    题面:https://www.cnblogs.com/Juve/articles/11663898.html 69: 本以为T2傻逼题结果爆零了...T3原题虽然打的不是正解复杂度但是都不记得做过这道 ...

  6. TCP重传机制的学习应用

    1. TCP重传机制 TCP协议是一个可靠的协议.发送方每次发送一个数据包,需要等到ACK确认包再继续发送. 发出去的请求包在规定时间内没有收到ACK,不管是请求包丢失,还是ACK包丢失,还是网络延迟 ...

  7. 08_springmvc数据回显和@ModelAttribute注解详解

    一.数据回显 提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面. 二.pojo数据回显方法 1.springmvc默认对pojo数据进行回显. pojo数据传入controller方法后,s ...

  8. Sql Server 2005主机和镜像切换SQL语句

    --1.主备互换 --主机执行: USE master; ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --2.主服务器Down掉 ...

  9. 前端面试题(js部分)

    一.==和===的区别 1.==   用于比较.判断两者相等,比较时可自动换数据类型 2.===  用于(严格)比较.判断两者(严格)相等,不会进行自动转换,要求进行比较的操作数必须类型一致,不一致时 ...

  10. commons-httpclient和org.apache.httpcomponents的区别

    <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpc ...