题意: 随机数 seed(x+1) = [seed(x) + STEP] % MOD
如果 STEP = 3,MOD = 5 循环节 0,3,1,4,2,正好满足了随机数0~4随机循环,说明这个选择为 Good Choice
如果 STEP = 15,MOD = 30 循环节 0, 15, 10, 5,没有满足随机数0~29循环,说明这个选择为Bad Choice
现在给你 STEP 和 MOD 判断是 Good Choice 或者Bad Choice
第一种解法 暴力
思路:以为在0~~~MOD-1的随机数,所以只要循环MOD-1次就可以了,如果中间重复,就是Bad Choice,如果没出现说明Good Choice
因为 有一个数重复,那么必然后面的数都重复,所以只要循环MOD-1。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int visit[100005];
int main()
{
int sept,mod;
while(scanf("%d%d",&sept,&mod) != EOF)
{
int flag = 0,n = 0;
memset(visit,0,sizeof(visit));
for(int i = 1; i <= mod; i++)
{
n = (n + sept) % mod;
if(visit[n])
{
flag = 1;
break;
}
else
{
visit[n] = 1;
}
}
if(flag)
printf("%10d%10d Bad Choice\n\n",sept,mod);
else
printf("%10d%10d Good Choice\n\n",sept,mod);
}
return 0;
}
思路二:数论
seed(x+1) = [seed(x) + STEP] % MOD,他要出现k的循环节所以 seed[k] = (seed[0] + STEP*k) %MOD = seed[0],
seed[0] = 0,所以seed[k] =STEP*k %MOD = 0,说明seed[k] =STEP*k = n * MOD,
因为 要出现MOD的循环节 所以 k >= MOD 所以 STEP * MOD = n * MOD,n = SEPT,结果他们是互质的才能是这样
所以 gcd(SEPT,MOD) = = 1 是 Good Choice 否则 Bed Choice
拓展:求其循环节长度
如果他们互质,他们的循环节为MOD。
如果他们有公因数,因为STEP*k = n * MOD,n最小取1 原式 = STEP*k = MOD,k为循环节长度,k = MOD / STEP