HDU 1014

题很长,看起来挺唬人的,其实是纸老虎。

大意就是给出两个数,STEP , MOD

然后根据给出的递推公式算一下 0~ mod-1之间的数是否都有出现过,如果都出现了,那就是Good 否则bad

初始种子不只是0,可以取0~mod-1之间的所有数,所以要用一个循环检验所有情况

 

//Problem:hdu1014
//Data:2011/10/30

#include <iostream>
#include <cstring>
#include <iomanip>

using namespace std;
bool num[100000];		//此数组,下标表示随机数,如果此数出现,则对应真值设为true(初始全为false) 
int main()
{
	//freopen("E:\\in.txt","r",stdin);
	int step,mod;
	int i,j;
	//bool first = true;
	while(cin>>step>>mod)
	{		
		/*
		if(first)		
			first = false;			
		else
			cout << endl;
		*/
		bool result = false;
				
		for(i=0; i<mod; i++)// Every "i" is an initial seed
		{
			bool this_time_isok = true; 
			memset(num, false, mod);
			
			int temp = i;
			num[temp] = true;
			
			while(true)
			{
				temp = (temp + step) % mod;
				
				if(temp == i)	//如果相等则出现周期了,因为每个数字的处理方式均一样 
					break;
					
				num[temp] = true;
			}
			//检验结果 
			for(j=0; j<mod; j++)
			{
				if(num[j] == false)
				{
					this_time_isok = false;
					break;
				}					
			}
			
			if(this_time_isok)
			{
				result = true;
				break;
			}			
		}
		
		//输出结果 
		//注意中间那里输出4个空格
		//每行输出完后下面跟一行空行,包括最后一行 
		cout << setiosflags(ios::right) << setw(10) << step << setw(10) << mod << "    "; 
		cout << setiosflags(ios::left); 
		if(result)
			cout << "Good Choice" << endl << endl;
		else
			cout << "Bad Choice" << endl << endl;
	}
	
	return 0;
}


 

你可能感兴趣的:(ios)