http://acm.uestc.edu.cn/problem.php?pid=1784&&
時間は物事の中で最もとらえどころのないものであり、それを測定するだけでも十分に困難です。一般に、時間の測定は、同じ期間で繰り返し発生する可能性があるイベントに関して測定可能な時間の最小単位を定義します。そこでクロリアは時間を測る良い方法を考えました。
クロリアはマッチの箱を持っています。マッチの頭が取り外されると、マッチは同じ長さの棒になります。クロリアは、棒 (マッチの頭のない) の一方の端に火が着くと、全体の燃焼が x 時間続くことを知っています。クロリアはスティックの両端から同時に点火することもでき、燃焼時間は x/2 時間持続します。現在、クロリアはこのマッチの山を使って時間を伝えたいと考えており、どのような時間を完全に正確に計算できるかを尋ねています。
最初の行には整数 T (T
正確に計算できるかできないかを示す文字列「YES」または「NO」。
4
1 1 1
1 2 1
1 4 1
1 5 1
はい
はい
はい
いいえ
棒の端から火をつけます。
スティックの両端から同時に点火します。
スティックの一方の端から点火し、同時にスティックの両端から点火します。最初の棒が燃え尽きたら、残りの棒の火を消します。最後に残ったスティックの両端に同時に点火します。
昨日の午後のコンテストの質問、私が長い間探していた質問です~
質問の意味: x と x/2 という 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; }