题目
题目描述
RPK 要带 MSH 去一个更加神秘的地方! RPK 带着 MSH 穿过广场,在第 1618
块砖上按下了一个按钮,在一面墙上随即出现了一个把手。RPK
握住把手,打开了一扇石质大门。他们穿过悠长而芬芳的小道,走到了一扇象征时间的大门——“the gate of time”。
门上写着一个关于时间的谜题 “承诺:____ 年”,RPK 思考了一会,从容地用手指写下 1 万,这时,门开始发出闪光,MSH
感觉到自己的心跳都快停止了。 门开了,眼前是一座美丽的神秘花园!正当 RPK 和 MSH 准备进入的时候,突然出现了一个看门的老大爷 QL。 QL:“你们干什么你们,还没买票呢!” RPK
突然想起来现金全拿去买蛋糕了,RPK 很绅士的问:“能刷卡么?我身上没现金。” QL:“没钱?那你们不能进去!” RPK(汗):“……”
QL:“等等,我这有道不会的数学题,你解了我就让你们进去。” (众人:“……”)
有一个数列
{
a
n
}
,
a
0
=
1
,
a
i
+
1
=
(
A
×
a
i
+
a
i
m
o
d
B
)
m
o
d
C
\{a_n\}, a_0 = 1, a_{i+1} = (A\times{a_i} + a_i \bmod B) \bmod C
{an},a0=1,ai+1=(A×ai+aimodB)modC,要求这个数列第一次出现重复的项的标号。
这点小问题当然难不倒数学 bug 男 RPK 了,仅凭心算他就得到了结果。
输入格式
一行三个数,分别表示 A, B, C。
输出格式
输出第一次出现重复项的位置,如果答案超过 2 × 1 0 6 2\times 10^6 2×106 输出 -1。
代码详解
ACcode
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const ull N=1e7;
const ull b=1311;
ull hassh;
ull A,B,C;
char s[N];
struct Haash{
ull h[N],l;
ull tot,adj[N],nxt[N],num[N];
ull top,stk[N];
void init(){
tot=0;
while(top){
adj[stk[top--]]=0;
}
}
void insert(ull key){
ull h=key%b;
for(ull e=adj[h];e;e=nxt[e]){
if(num[e]==key){
return;
}
}
if(!adj[h]){
stk[++top]=h;
}
nxt[++tot]=adj[h],adj[h]=tot;
num[tot]=key;
}
bool query(ull key){
ull h=key%b;
for(ull e=adj[h];e;e=nxt[e]){
if(num[e]==key){
return true;
}
}
return false;
}
}ha;
int main()
{
cin>>A>>B>>C;
int ans=0;
ha.insert(1);
hassh=(A*1+1%B)%C;
while(!ha.query(hassh)){
ha.insert(hassh);
hassh=(A*hassh+hassh%B)%C;
ans++;
}
cout<<ans+1;
return 0;
}
好!哈希狠狠地TLE!
对不起,哈希
ACcode
逃课ing
//#define LOCAL 如果提交的话把这个去掉就行
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const ull N=1e8;
const ull b=1311;
ull hassh;
ull A,B,C;
char s[N];
bool q[N];
int main()
{
#ifdef LOCAL//刘汝佳助我!!!!!!!!!!!
freopen("data.in","r",stdin);//有效减少出错率
freopen("data.out","w",stdout);
#endif//刘汝佳神力!!!!!!!!!!!!!!!!
cin>>A>>B>>C;
ull ans=0;
q[1]=1;
hassh=(A*1+1%B)%C;
while(++ans){
if(ans>2000000){
cout<<-1;
return 0;
}
if(q[hassh]){
cout<<ans;
break;
}
q[hassh]=1;
hassh=(A*hassh+hassh%B)%C;
}
return 0;
}
好,如果你哈希TLE了,请逃课
逃课指南:
- unordered_set
- 桶
- 刘汝佳sama的手写哈希