Problem
codeforces.com/contest/834/problem/C
Meaning
两人分数一开始都是 1,每一场比赛都选定一个数字 k,赢的人分数乘上 k2 ,输的人乘上 k。现给出两个分数 a 和 b,问有没有可能经过若干场比赛后,两人的分数分别是 a 和 b。
Analysis
从得分算法来看,最终结果可以拆成:
a=pq2,b=p2q
,所以 ab 是个立方数,有:
ab=(pq)3
,而且 a 和 b 都能整除 pq。
二分找出 pq,判断
(pq)3
是不是等于 ab、a 是否整除 pq、b是否整除 pq。
Code
#include <iostream>
using namespace std;
int find(long long x)
{
int l = 0, r = 1000000;
for(long long m; l + 1 < r; )
{
m = l + r >> 1;
if(m * m * m < x)
l = m;
else
r = m;
}
return r;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
for(long long a, b, c; n--; )
{
cin >> a >> b;
c = find(a * b);
if(c * c * c != a * b || a % c || b % c)
cout << "No\n";
else
cout << "Yes\n";
}
return 0;
}