思路:刚开始只是让它来回循环,结果就Memory limit exceeded,后来通过看别人的博客发现自己将问题解复杂了,从前的思路容易使运算过程中数据超出类型的储存范围。正确的解法是判断N与M的最大公约数是否为1,如果不为1,将意味着他将一直找下去,但总有人未被search。
附原来的错误代码,仅供参考:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 100000005;
int a[maxn];
int main()
{
int n, m;
while(cin >> n >> m && (n != -1 && m != -1))
{
memset(a, 0, sizeof(a));
int i;
for(i = 0; i < n; )
{
if(a[i] == 1)
break;
a[i] = 1;
i = i + m;
if(i >= n)
i = i % n;
}
int flag = 0;
for(i = 0; i < n ;i++)
{
if(a[i] != 1)
flag = 1;
}
if(flag == 1)
cout << "POOR Haha" << endl;
else
cout << "YES" << endl;
}
return 0;
}
以下是正确代码:
#include<iostream>
using namespace std;
int gcd(int n, int m)
{
int temp;
if(n < m)
{
temp = n;
n = m;
m = temp;
}
int mod = n % m;
while(mod != 0)
{
n = m;
m = mod;
mod = n % m;
}
return m;
}
int main()
{
int n, m;
while(cin >> n >> m && (n != - 1 || m != -1))
{
int t = gcd(n, m);
if(t == 1)
cout << "YES" << endl;
else
cout << "POOR Haha" << endl;
}
return 0;
}