伪随机数(gcd+裴蜀定理)

第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

每组测试数据输入两个数 STEPMOD, 判断是否为正确的设定。1STEP,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;
}

 

 

 

 

 
 

 

posted @ 2024-02-03 09:14  cn是大帅哥886  阅读(51)  评论(0)    收藏  举报