当前位置: 代码迷 >> PHP >> http://acm.uestc.edu.cn/problem.php?pid=1784&&
  详细解决方案

http://acm.uestc.edu.cn/problem.php?pid=1784&&

热度:966   发布时间:2012-12-19 14:13:14.0
http://acm.uestc.edu.cn/problem.php?pid=1784&&

Description

时间是最难以捉摸的东西,光是测量它们就已经很难了。一般而言,测量时间用一个可重复等时长发生的事件来定义最小的时间可测单位。于是Krolia想到了一个测量时间的好方法。
Krolia有一盒火柴,如果把火柴的头去掉火柴就会变成一样长的木棍。Krolia知道一根(没有火柴头)木棍一端点燃后,整个燃烧会持续x时间。Krolia还可以从两端同时点燃木棍,这样燃烧会持续x/2时间。现在Krolia想用这堆火柴来计时,问什么样的时间可以被完全精确地计算出。

Input

第一行一个整数T(T<=1000),表示有T组测试数据,每组测试数据行三个整数a,b,x(1<=a,b,x<=10^9)表示要测量a/b,一根火柴的燃烧时长是x时间。

Output

一个字符串,"YES"或者"NO"表示能或者不能被精确计算。

Sample Input

4
1 1 1
1 2 1
1 4 1
1 5 1

Sample Output

YES
YES
YES
NO

Hint

从一端点燃一根木棍。
从两端同时点燃一根木棍。
从两端同时点燃一根木棍的同时,从一端点燃一根木棍。当第一根木棍燃烧殆尽的时候,把剩下的那根木棍的火熄灭。最后把剩下的木棍的两端同时点燃。


昨天下午的比赛题,一个规律找了很久的题~ 

题意:给你两个数x和x/2,问能否表示出a/b,通过找规律可知,如果x是偶数可以将其转化奇数,然后找到x为奇数的规律:分子a必须可以整除x,b一定可以转化为2的几次方的形式。

AC代码:

 #include <iostream>
#include<string.h>
#include<algorithm>
#include<cstdio>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
using namespace std;
int gcd(int a,int b)
{
    while(b)
    {
        int temp=a%b;
        a=b;
        b=temp;
    }
    return a;
}
void in(int &a)
{
    char ch;
    while((ch=getchar())<'0'||ch>'9');
    for( a=0;ch>='0'&&ch<='9';ch=getchar()) a=a*10+ch-'0';

}
int main()
{
   int n;
   while(~scanf("%d",&n))
   {
       for(int i=0;i!=n;++i)
       {


     int a,b,x;
     in(a),in(b),in(x);
     int ans=gcd(a,b);
     a=a/ans;
     b=b/ans;
     while(x%2==0) x/=2;
     int k=b;
    if(a%x==0){
           while(k%2==0) k/=2;
           if(k==1) puts("YES");
           else  puts("NO");
     }
     else  puts("NO");

   }
   }
  return 0;
}
 				    


  相关解决方案