题目描述
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\times 10^6 输出 -1。
样例
输入
1 2 2 9
输出
1 4
#include<bits/stdc++.h>
using namespace std;
long long A,B,C,k=1;
unordered_set<long long> s;
int main()
{
cin>>A>>B>>C;
for(int i=1;;i++)
{
if(i>=2000000)
{
cout<<"-1";
break;
}
if(s.count(k)==1)
{
cout<<i-1;
break;
}
s.emplace(k);
k=(A*k+k%B)%C;
}
return 0;
}
用STL库里的unordered_set
判重
unordered_set
:
①empalce:向s里添加新的元素
②cout:从s里搜索元素