HDU 1014 Uniform Generator 题解
找到规律之后本题就是水题了。只是找规律也不太easy的。证明这个规律成立更加不easy。
本题就是求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的值为多少,由于我们想知道第一次比x0大的数是多少,那么就看n*step%mod会是多少了。由于GCD(step, mod) == 1。那么n*step%mod必定是等于1。故此第一次反复出现比x0大的数必定是x0+1,那么第二次出现比x0大的数必定是x0+2。以此类推,就可得到必定会出现全部0到mod-1的数,然后才会反复出现x0.
当GCD(step, mod) != 1的时候,能够推出肯定跨过某些数了。这里不推了。
然后能够扩展这个结论。比方假设使用函数 x(n) = (x(n-1) * a + b)%mod;添加了乘法因子a。和步长b了;
那么假设是Good Choice,就必定须要GCD(a, mod) == 1,并且GCD(b, mod) == 1;
这里就偷懒不证明这个扩展结论了,并且证明这个结论须要用到线性模(Congruence)和乘法逆元的知识了。
题目:
seed(x+1) = [seed(x) + STEP] % MOD
where '%' is the modulus operator.
Such a function will generate pseudo-random numbers (seed) between 0 and MOD-1. One problem with functions of this form is that they will always generate the same pattern over and over. In order to minimize this effect, selecting the STEP and MOD values carefully
can result in a uniform distribution of all values between (and including) 0 and MOD-1.
For example, if STEP = 3 and MOD = 5, the function will generate the series of pseudo-random numbers 0, 3, 1, 4, 2 in a repeating cycle. In this example, all of the numbers between and including 0 and MOD-1 will be generated every MOD iterations of the function.
Note that by the nature of the function to generate the same seed(x+1) every time seed(x) occurs means that if a function will generate all the numbers between 0 and MOD-1, it will generate pseudo-random numbers uniformly with every MOD iterations.
If STEP = 15 and MOD = 20, the function generates the series 0, 15, 10, 5 (or any other repeating series if the initial seed is other than 0). This is a poor selection of STEP and MOD because no initial seed will generate all of the numbers from 0 and MOD-1.
Your program will determine if choices of STEP and MOD will generate a uniform distribution of pseudo-random numbers.
message should be printed when the selection of STEP and MOD will generate all the numbers between and including 0 and MOD-1 when MOD numbers are generated. Otherwise, your program should print the message "Bad Choice". After each output test set, your program
should print exactly one blank line.
3 5
15 20
63923 99999
3 5 Good Choice 15 20 Bad Choice 63923 99999 Good Choice
#include <stdio.h> inline int GCD(int a, int b)
{
return b == 0? a : GCD(b, a % b);
} int main()
{
int step, mod;
while (scanf("%d %d", &step, &mod) != EOF)
{
printf("%10d%10d ", step,mod);
if(GCD(step, mod) == 1) printf("Good Choice\n\n");
else printf("Bad Choice\n\n");
}
return 0;
}
HDU 1014 Uniform Generator 题解的更多相关文章
- HDU 1014 Uniform Generator(模拟和公式)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1014 Uniform Generator Time Limit: 2000/1000 MS (Java ...
- HDU 1014 Uniform Generator(题解)
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1014 Uniform Generator【GCD,水】
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1014:Uniform Generator
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 1014.Uniform Generator 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 题目意思:给出 STEP 和 MOD,然后根据这个公式:seed(x+1) = [seed(x) ...
- HDU 1014 Uniform Generator 欧几里得
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 解题思路: 1. 把题目意思读懂后,明白会输入两个数,然后根据题中的公式产生一系列伪随机数,看这 ...
- hdu 1014 Uniform Generator 数论
摘取于http://blog.csdn.net/kenden23/article/details/37519883: 找到规律之后本题就是水题了,不过找规律也不太容易的,证明这个规律成立更加不容易. ...
- HDU 1014 Uniform Generator(最大公约数,周期循环)
#include<iostream> #include <cstdio> #include <cstring> using namespace std; int m ...
- 1014 Uniform Generator ACM
http://acm.hdu.edu.cn/showproblem.php?pid=1014 题目的英文实在是太多了 ,搞不懂. 最后才知道是用公式seed(x+1) = [seed(x) + STE ...
随机推荐
- 【转载】性能监视器(SSAS)
使用性能监视器,您可以通过性能计数器监视 Microsoft SQL Server Analysis Services (SSAS) 实例的性能. 性能监视器是用于跟踪资源使用情况的 Microsof ...
- eclipse CreateProcess error=87
http://blog.csdn.net/mylove709834360/article/details/9253697 完美解决~
- Buffer源码深入分析
博客园对MarkDown显示的层次感不是很好,大家可以看这里:Buffeer. 本机环境: Linux 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33 ...
- 01背包【p1060】开心的金明
Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要 ...
- 利用MAP动态创建C++类对象
MFC的CRuntimeClass利用链表实现了C++类的动态创建.但是如果项目中对动态创建的要求比较低,我们完全可以利用map实现简单的动态创建. http://blog.csdn.net/yeji ...
- Codeforces E. Bash Plays with Functions(积性函数DP)
链接 codeforces 题解 结论:\(f_0(n)=2^{n的质因子个数}\)= 根据性质可知\(f_0()\)是一个积性函数 对于\(f_{r+1}()\)化一下式子 对于 \[f_{r+1} ...
- C++指针、引用知多少?
上午搞了一个小程序,test半天都没有得到想要的结构,原来是递归的时候没有注意的循环的问题,结果直接死循环了.催了...看来当程序出现问题的时候,首先要整理的是算法思路是否有问题,其次是算法的实现,是 ...
- java中终止线程的三种方式
在java中有三种方式可以终止线程.分别为: 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止. 2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和sus ...
- OpenFire匿名登陆
原文:http://blog.csdn.net/majian_1987/article/details/9714529 首先在服务的控制台,设置允许匿名登陆,设置界面如下: package com.b ...
- 如何把自己的代码发布到npmjs(npm publish)
来源: https://www.cnblogs.com/calamus/p/8384318.html