第2题 伪随机数 查看测评数据信息
一个生成伪随机数的函数,seed(a+1)=[seed(a)+STEP] % MOD,为了能产生0~MOD-1的所有数,需要设定合适的 STEP和 MOD。
例如,STEP=3, MOD=5,产生0,3,1,4,2,这是正确的设定;
若STEP=15,MOD=20,只能产生0,15,10,5,这是错误的设定。
输入格式
多组测试数据。
第一行,一个整数T,表示T组测试数据。1<=T<=10000。
每组测试数据输入两个数 STEP、MOD, 判断是否为正确的设定。1≤STEP,MOD<2000000000。
输出格式
共T行,正确的设定输出”yes”,否则输出”no”。
输入/输出例子1
输入:
2
3 5
15 20
输出:
yes
no
样例解释
无
题目的要求可以转化为x * STEP %MOD = d,其中x是倍数,d要取到0~MOD-1的所有值。
为方便分析,设a = STEP, b = MOD,式子变为ax % b = d(令ax%b=d,ax-zb=d,z是整数,再令y=-z,即ax+yb,x,y也是整数)
, 等价于ax + by = d(d={0,1,2,3.....,d-1},ax+by=gcd(a,b)的倍数=d)。
我们gcd(a,b)>1,可能是gcd(a,b)=2,那么d永远只能取2,4,6...2的倍数,不能取到1,3,5,7....。gcd(a,b)=3,也是如此
证明gcd(a,b)只可能为1
根据裴蜀定理,d 是gcd(a,b)的整数倍时有解;若gcd(a ,b) = 1, 那么d能取到0至d-1的所有值。
【思考】如何证明x是可以取连续的[0,n-1]就一定满足题意?
因为根据裴蜀定理,若gcd(a ,b) = 1,ax + by = d(d取1,2,...Mod-1)是一定存在解的,且x也一定由正整数解,
那么x从0逐步增加到Mod-1时,(x * STEP) %MOD的值一定不重复,因为一旦重复,就会形成环,就会有一些d无解了。
所以,只需要判断 gcd(a,b)=gcd(STEP,MOD)=1是否成立, 若成立,则是正确的设定。
以下是参考程序:
#include <bits/stdc++.h> using namespace std; int t, a, b; int gcd(int a, int b) { if (b==0) return a; return gcd(b, a%b); } int main() { scanf("%d", &t); while (t--) { scanf("%d%d", &a, &b); if (gcd(a, b)==1) printf("yes\n"); else printf("no\n"); } return 0; }
标签:设定,gcd,int,STEP,随机数,ax,裴蜀,MOD From: https://www.cnblogs.com/didiao233/p/18004346