码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1014 Uniform Generator

时间:2015-06-06 14:58:54      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

分析:题意是一个生成随机数的函数,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] + STEP*k ) % MOD
那么,STEP * k %MOD,而如果要生产MOD个数,必须使k≥MOD,而且k不可能大于MOD,因为这个条件下生成的数又开始重复,所以k=MOD;在前面的条件下,如果STEP和MOD有大于1的公约数例如d,那么会有STEP*(k/d) = MOD,这就是一个循环了,只会产生k/d<MOD个随机数。也就是两个数要互质。
结论:if gcd(STEP, MOD) == 1, good choice.

#include<iostream>
using namespace std;

int gcd(int x,int y)
{
	return y==0?x:gcd(y,x%y);
}

int main()
{
	int s,m;

	while(cin>>s>>m)
	{
		printf("%10d%10d    ",s,m);
		if(gcd(s,m)==1)
			cout<<"Good Choice\n"<<endl;
		else
			cout<<"Bad Choice\n"<<endl;
	}
    return 0;
}


HDU ACM 1014 Uniform Generator

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46387891

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!