HDOJ1014
题目
思路
简单来说,题目的意思是给定STEP和MOD,能够把0到MOD-1的数都产生一次的就是Good Choice,否则就是Bad Choice。
1.暴力求解:定义一个seed数组从seed[0]依次往后计算。定义一个布尔型isChange数组,计算出seed[i]的值时,对应的isChange[seed[i]]就记为true。最后如果isChange数组中的值都为true,说明从0到MOD-1的数都产生了,结果为Good Chioce。
2.互质:如果STEP和MOD互质,结果为Good Choice。
3.基于方法一的优化:不用isChange数组,用一个计数器记录产生的seed数组元素的数量。一旦seed等于零,说明产生的数出现了循环,break。这样的话相比方法一节省了很多内存。
代码
暴力求解
#include<cstdio>
#include<iostream>
#include<string.h>
#include <iomanip>
#include <cstring>
using namespace std;
int main()
{
int STEP, MOD, i, flag;
bool isChange[100000];
int seed[100000];
while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000)
{
memset(isChange, false, sizeof(isChange));
flag = 1;
seed[0] = 0;
isChange[seed[0]] = true;
for(i=0;i<MOD-1;i++)
{
seed[i+1]= (seed[i] + STEP)%MOD;
isChange[seed[i+1]] = true;
}
for(i=0;i<MOD;i++)
{
if(isChange[i]==false)
{
flag = 0;
break;
}
}
cout << setiosflags(ios::right) << setw(10) << STEP << setw(10) << MOD << " ";
cout << setiosflags(ios::left);
if(flag==1)
{
printf("Good Choice\n\n");
}
else
{
printf("Bad Choice\n\n");
}
}
}
互质
#include<stdio.h>
int zg(int step, int mod)
{
if(mod==0)
{
return step;
}
else
{
zg(mod, step%mod);
}
}
int main()
{
int STEP, MOD, i;
while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000)
{
if(zg(STEP, MOD)==1)
{
printf("%10d%10d Good Choice\n\n",STEP,MOD);
}
else
{
printf("%10d%10d Bad Choice\n\n",STEP,MOD);
}
}
}
暴力求解优化(内存优化)
#include<stdio.h>
int main()
{
int STEP, MOD, i;
int count;
int seed;
while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000)
{
count = 1;
seed = 0;
for(i=0;i<MOD;i++)
{
seed= (seed + STEP)%MOD;
if(seed!=0)
{
count++;
}
else
{
break;
}
}
if(count==MOD)
{
printf("%10d%10d Good Choice\n\n",STEP,MOD);
}
else
{
printf("%10d%10d Bad Choice\n\n",STEP,MOD);
}
}
}
Conclusion
条条大路通罗马,可以多尝试一些方法。另外,输出格式仍然是一个不可忽视的问题,仔细审题。