hdu1222-Wolf and Rabbit
题目链接戳这里:hdu1222
题意大概是叫你输入m和n,n代表有几个洞,洞的序号分别是0,1,…,n-1,然后先搜第0个洞口,然后第m个洞口,第2m个洞口…如果大于n-1的话会回到开头,相当于一个环。
题解:判断m和n是否互质,如果互质则没有洞口漏掉,如果不互质即两者的最大公约数大于1,那么一定会有洞口被漏掉,这里简单解释一下。
所有被访问的洞口的编号可以表示为 p * m - q * n (p, q为大于等于0的整数且使得该式大于0),如果 m, n 两个数存在一个公约数为 k,那么所有被访问洞口的编号可以表示为 k * ( p * (m / k ) - q * ( n / k ) )显然,p * (m / k ) - q * ( n / k ) 为大于等于1的整数,如果 k > 1,那么编号中将不存在 1,… , k-1,即存在洞口没有被访问。
题解:
主要就是会求最大公约数,那么这个代码就没什么问题,这要用到一个定理,假如两个数相除,那么这两个数的最大公约数等于被除数与余数的最大公约数,如果余数为零那么被除数就是最大公约数。
#include<cstdio>
#include<map>
#include<iostream>
#include<string>
using namespace std;
int gcd(int m,int n);
int main()
{
int m, n, N;
cin >> N;
while (N--)
{
cin >> m >> n;
if (gcd(m, n) == 1)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
return 0;
}
int gcd(int a, int b)
{
if (b == 0)
return a;
else
return gcd(b, a%b);
}