题目描述#
数列 S 是由生成式 sn=(a⋅sn−1+b)modm,s0=0 产生的,我们定义f(S)=min{x∉S∣x∈N}。
现在给你数列S的参数a,b,m,求f(S)。
输入#
第一行是一个整数T(1≤T≤1000),表示样例的个数。 第二行是三个整数a,b,m(0≤a,b≤105,1≤m≤105)。
输出#
依次每行输出一个样例的结果。
样例输入#
3 1 3 5 1 2 4 2 4 5
样例输出#
5 1 1
样例解释#
第一个样例的数列为0,3,1,4,2,0,…,所以答案为5。
第二个样例的数列为0,2,0,…,所以答案为1。
第三个样例的数列为0,4,2,3,0,…,所以答案为1。
解析#
直接看代码:
(叠甲:第一次发,写的一坨,请见谅!!!)
#include<stdio.h>
#include<string.h>
int vis[100010];//由于标记余数
__int64 a,b,m,s;
int main()
{
int T,i;
scanf("%d",&T);
while(T--){
scanf("%I64d %I64d %I64d",&a,&b,&m);
memset(vis,0,sizeof(vis));//每个样例重置一次余数
s=0;//初始余数为0
while(1){
s=(a*s+b)%m;
if(vis[s]){
break;//表示数列已经开始循环,直接break;
}else{
vis[s]=1;
}
}
for(i=1;i<=m;i++){//注意应该从1开始
if(!vis[i]){
printf("%d\n",i);
break;
}
}
}
return 0;
}