p.s.个人收录用
题目描述
一开始你有一堆数量为n的金块,你可以可以执行以下操作:取任意一堆金块并将其分成两堆,这样产生的一堆金块的数量恰好是另一堆的两倍(任意一堆金块的数量都应该是整数个)。
一种可能的举动是拿一堆数量为6的金块并将其分为数量为4和数量为2的两堆金块。
你能从这堆金块中分出一堆数量为m的金块吗?
输入
第一行一个整数t表示测试组数,每个测试样例包含两个整数n和m表示起始金块的数量和需要分出一堆金块的数量。
输出
对于每个测试样例,如果可以从这堆金块中分出一堆数量为m的金块,输出"YES",否则输出"NO"。
样例输入 Copy
11 6 4 9 4 4 2 18 27 27 4 27 2 27 10 1 1 3 1 5 1 746001 2984004
样例输出 Copy
YES YES NO NO YES YES NO YES YES NO NO
代码
#include <stdio.h>
#include <string.h>
int is(int n, int m)
{
if (n % 3 != 0)
return 0;
int t = n / 3;
if (m == t || m == 2 * t)
return 1;
else if (n < m)
return 0;
else
return is(n / 3, m) + is(n / 3 * 2, m);
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n, m;
scanf("%d%d", &n, &m);
if (n == m)
printf("YES\n");
else if (n % 3 != 0)
printf("NO\n");
else if (n < m)
printf("NO\n");
else
{
int flag = is(n, m);
if (flag)
printf("YES\n");
else
printf("NO\n");
}
}
}