(HDU)1014 --Uniform Generator(统一随机数生成)

这个题目不难,关键是看懂英文:(判断两个数是否互质,而且注意输出的格式)

描述
计算机模拟通常需要随机数。生成伪随机数的一种方式是通过一定形式的函数:

seed(x + 1)= [seed(x)+ STEP]%MOD

其中‘%‘是模运算符。

这样的函数将生成在0和MOD-1之间的伪随机数(种子)。这种形式的作用的一个问题就是,它们将总是重复地生成相同的模式。

为了最小化这种影响,仔细选择STEP和MOD值,可以使得在0和MOD-1(包括这两者)之间的所有值的均匀分布。

例如,如果STEP = 3和MOD = 5,该函数将在重复周期中生成一系列伪随机数0,3,1,4,2。在该示例中,将在函数的每个MOD迭代中生成包括0和MOD-1之间的所有数字。注意,由于每次产生种子(x)时生成相同种子(x + 1)的函数的性质,意味着如果函数将生成在0和MOD-1之间的所有数字,则它将均匀地生成伪随机数与每个MOD迭代。

如果STEP = 15和MOD = 20,该函数生成系列0,15,10,5(或任何其他重复系列,如果初始种子不是0)。这是一个很差的STEP和MOD选择,因为没有初始种子将生成从0和MOD-1的所有数字。

您的程序将确定STEP和MOD的选择是否将生成伪随机数的均匀分布。

输入
每一行输入将按顺序包含一对用于STEP和MOD的整数(1 <= STEP,MOD <= 100000)。

输出
对于每一行输入,您的程序应在第1列至第10列右对齐输出STEP值,第11列至第20列右对齐的MOD值,以及从第25列左对齐输出“Good Choice”或“Bad Choice” 。当生成MOD号时,选择STEP和MOD将生成0和MOD-1之间的所有数字时,应输出“Good Choice”信息。否则,您的程序应输出信息“Bad Choice”。在每个输出测试集之后,程序应该输出一个空白行。

样例输入
3 5
15 20
63923 99999

样例输出
            3      5  Good Choice

          15   20   Bad Choice

     63923 99999   Good Choice

问题

 1 #include <iostream>
 2 #include <cstdio>
 3
 4 using namespace std;
 5
 6 int gcd(int a, int b)
 7 {
 8     return a%b?gcd(b,a%b):b;
 9 }
10
11 int main ()
12 {
13     char tab[2][15] = {"Bad Choice", "Good Choice"} ;
14     int a, b ;
15     while (~scanf ("%d%d", &a, &b))
16     {
17         printf ("%10d%10d    %s\n\n", a, b, tab[gcd(a,b)==1]) ;
18     }
19     return 0 ;
20 }

精简代码

时间: 2024-10-27 23:28:36

(HDU)1014 --Uniform Generator(统一随机数生成)的相关文章

HDU 1014 Uniform Generator 题解

找到规律之后本题就是水题了,不过找规律也不太容易的,证明这个规律成立更加不容易. 本题就是求step和mod如果GCD(最大公约数位1)那么就是Good Choice,否则为Bad Choice 为什么这个结论成立呢? 因为当GCD(step, mod) == 1的时候,那么第一次得到序列:x0, x0 + step, x0 + step-- 那么mod之后,必然下一次重复出现比x0大的数必然是x0+1,为什么呢? 因为(x0 + n*step) % mod: 且不需要考虑x0 % mod的值为

HDU 1014 Uniform Generator

Uniform Generator Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22610    Accepted Submission(s): 8889 Problem Description Computer simulations often require random numbers. One way to generate

HDU 1014 Uniform Generator【GCD函数】

Uniform Generator Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20180    Accepted Submission(s): 7902 Problem Description Computer simulations often require random numbers. One way to generat

HDU 1014.Uniform Generator【模拟及优化】【8月16】

Uniform Generator Problem Description Computer simulations often require random numbers. One way to generate pseudo-random numbers is via a function of the form seed(x+1) = [seed(x) + STEP] % MOD where '%' is the modulus operator. Such a function wil

HDU 1014 Uniform Generator(题解)

Uniform Generator Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 32990    Accepted Submission(s): 13081 Problem Description Computer simulations often require random numbers. One way to generat

hdu 1014.Uniform Generator 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 题目意思:给出 STEP 和 MOD,然后根据这个公式:seed(x+1) = [seed(x) + STEP] % MOD,问是否在一个周期里可以产生 0 - mod-1 的数.可以的话输出 "Good Choice", 否则输出 "Bad Choice". 好久以前留下来的问题了,以前觉得题目意思又长,以为是很难的题目......今天看<短码之美>

ACM HDU 1014 Uniform Generator

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 解题思路: 1. 把题目意思读懂后,明白会输入两个数,然后根据题中的公式产生一系列伪随机数,看这些数是不是能够包含0~MOD-1.如果产生不了就输出“Good Choice”,否则输出“Bad Choice”. 2. 全部假使x从0开始,设STEP为a,MOD为b.如果说a,b存在倍数关系,即假设最小存在2倍关系,那么就会有b=2a.x初始为0,第一步之后为a,第二步之后为0,之后a.0交替出

hdu 1014 Uniform Generator(水 枚举 gcd)

题意:有一个数列 seed[x+1]=(seed(x)+step)%mod 给出 step 和 mod 如果求出的是以 1...mod-1 为循环节的数列 则为 good choice 否则 则是 bad choice 思路:1.用标记法 如果 形成循环节时 每个数都被标记到 则good choice 2.当两个数互素时 则 good choice 2.代码 #include<cstdio> #include<cstring> #include<iostream> #i

HDU ACM 1014 Uniform Generator

分析:题意是一个生成随机数的函数,Seed[x+1] = ( seed[x] + STEP ) % MOD,seed是生成出来的随机数,seed[0]是哪个数并不重要,后面证明.STEP就是每次往前一个所加的值,再模上MOD得到下一个随机数. 判断这个随机生成函数的好坏的依据是如果能够产生0~MOD-1内的所有数,就是一个好的,否则坏(因此该題也可以用模拟,用HASH表). 根据同余特性,便可以假设在k步之后,生成的seed[k] = seed[0],所以有Seed[k] = ( seed[0]