首页 > 其他分享 >伪随机数(gcd+裴蜀定理)

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

时间:2024-02-03 09:22:44浏览次数:28  
标签:设定 gcd int STEP 随机数 ax 裴蜀 MOD

第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

相关文章

  • 数论-裴蜀定理
    原文 如果a与b均为整数,则存在整数x和y满足ax+by=(a,b)。由定理6容易证明正确性。 下面用扩展欧几里得算法(exgcd)求出满足ax+by=(a,b)的一个特解。例如:a=99,b=78,令d=(a,b)=(99,78)=3,求99x+78y=3的一个特解。在调用exgcd的时候,从后往前依次构造......
  • gcd & exgcd
    gcd&exgcdgcd设\(a=bk+c\),显然有\(c=a\bmodb\)。设\(d\mida,~d\midb\),则\(c=a-bk,\frac{c}{d}=\frac{a}{d}-\frac{b}{d}k\)。由右边的式子可知\(\frac{c}{d}\)为整数,即\(d\midc\),所以对于\(a,b\)的公约数,它也会是\(b,a\bmodb\)的公约数。反过来也需要证......
  • 欧拉函数——gcd问题的一大利器
    定义欧拉函数,即\(\varphi(n)\),表示的是\([1,n]\)内与\(n\)互质的数的个数,如\(\varphi(1)=1\)。若\(n\)是质数,显然\(\varphi(n)=n-1\)。性质欧拉函数是积性函数。若\(\gcd(a,b)=1\),则\(\varphi(a\timesb)=\varphi(a)\times\varphi(b)\)。更特殊......
  • UOJ #33 树上 GCD
    套路地,对每个\(g\in[1,n-1]\)求出有多少对无序对\((u,v)\)满足\(g|f(u,v)\),然后就可以用一个倒序枚举的\(\mathcalO(n\logn)\)的容斥求出答案。考虑点分治,对每个经过分治中心\(c\)的\(u\rightsquigarrow\text{lca}(u,v)\rightsquigarrowv\)只需分两种......
  • net8 随机数类Random GetItems() 、Shuffle()方法
    1、在8中对随机数类Random提供了GetItems()方法,可以根据指定的数量在提供的一个集合中随机抽取数据项生成一个新的集合:ReadOnlySpan<string>colors=new[]{"Red","Green","Blue","Black"};string[]t1=Random.Shared.GetItems(colors,10);Console.WriteLine(......
  • 洛谷题单指南-排序-P1059 [NOIP2006 普及组] 明明的随机数
    原题链接:https://www.luogu.com.cn/problem/P1059题意解读:此题主要做两件事:排序+去重,用计数排序即可解决,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=1005;inta[N];intn;intmain(){cin>>n;intx;intcnt......
  • CF1174E Ehab and the Expected GCD Problem
    EhabandtheExpectedGCDProblemLuoguCF1174E题目描述\(p\)是一个排列,定义\(f(p)\):设\(g_i\)为\(p_1,p_2,\cdots,p_i\)的最大公因数(即前缀最大公因数),则\(f(p)\)为\(g_1,g_2,\cdots,g_n\)中不同的数的个数。设\(f_{max}(n)\)为\(1,2,\cdots,n\)的所有排......
  • exgcd+乘法逆元相关笔记
    #include<iostream>#include<cstdio>usingnamespacestd;constintpass=0;//exgcd://求解二元一次不定方程//ax+by=(a,b)=(b,a%b)=bx'+(a%b)*y'=bx'+(a-b*(a/b))*y'=b*(x'-(a/b)*y')+ay'//则有y=(x'-(a/b)*y'),x=y'......
  • E - Ring MST(n个数裴蜀定理)
    E-RingMST有i种操作,第i种操作为选择一个数x,然后在x和(x+a[i])%N之间连边,代价为c[i],问是否能够让图联通,如果可以最小生成树的边权和是多少。首先按照克鲁斯卡尔算法,我们肯定是按照边权从小到大连。考虑前i种操作都操作完后的连通块个数。若u,v在同一联通块,则\(u\equivv+a......
  • 使用RanDom生成不重复的随机数
    首先看一下关键词的傻瓜讲解Random用法Random.Next()返回非负随机数;Random.Next(a)返回一个小于a的非负随机数Random.Next(a,b)返回一个大于a小于b的非负随机数contains用法list.Contains(a)判断列表list里是否含有a,有则返回true接下来看代码staticvoidMain(string[]args)......