题目概述
有一个游戏,过程如下:
1.有两个数
a,b
,刚开始
a=b=1
。
2.随便取一个正整数
k
,使 (1)
问最后
a,b
是否能够变成给出的
A,B
。
解题报告
其实我们只需要考虑
k
是质因子就行了,其他情况由质因子组成即可。
那么考虑
对于
∀i
,假设
x
表示(1)操作的次数,
x+2y=Ai
2x+y=Bi
即:
x=2Bi−Ai3
y=2Ai−Bi3
所以有解的充要条件是
Ai≤2Bi,Bi≤2Ai,3|(2Bi−Ai),3|(2Ai−Bi)
。
转化一下变为:
A|B2,B|A2
,
A2B
的立方根是整数,
B2A
的立方根是整数。
那么就很好判断了。
示例程序
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
int te;LL A,B;
bool check(LL A,LL B)
{
if (A*A%B) return false;
LL L=1,R=1000000,num=A*A/B;
while (L<=R)
{
LL mid=L+(R-L>>1);
if (mid*mid*mid>=num) R=mid-1; else L=mid+1;
}
if (L*L*L!=num) return false;
if (B*B%A) return false;
L=1;R=1000000;num=B*B/A;
while (L<=R)
{
LL mid=L+(R-L>>1);
if (mid*mid*mid>=num) R=mid-1; else L=mid+1;
}
if (L*L*L!=num) return false;
return true;
}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
scanf("%d",&te);
while (te--)
{
scanf("%lld%lld",&A,&B);
if (check(A,B)) printf("Yes\n"); else printf("No\n");
}
return 0;
}