题目链接:http://codeforces.com/contest/834/problem/C

题意:两个在玩一个游戏,对于每一轮,选定一个自然是k,初始两人的分数都为1,每一个回合赢的人在他当前分数的基础上乘以k^2,输的人在他当前分数的基础上乘以k,现在经过若干回合后他们的分数分别是a,b问你这个a,b是否合法。

思路:首先对于每一个回合,赢的人乘以k^2,输的人乘以k,那么对于k来说每一个回合对于两个的总贡献就是k^3,不管3个k怎么分配的这两个人。所以两个人的总分数(a*b)一定是一个三次方数。 所以可以二分k,找到一个k满足k^3==a*b。 并且还要满足a%k==0&&b%k==0,因为每次a和b都是乘以k(不管乘了1次还是2次),所以a和b一定要是k的倍数。

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<time.h>
#include<cmath>
#include<set>
#include<map>
using namespace std;
typedef long long int LL;
const int MAXN = 1e6 + ;
const int INF = 1e9;
const int mod = 1e9 + ;
int main(){
#ifdef kirito
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int n, a, b;
while (~scanf("%d", &n)){
for (int i = ; i <= n; i++){
scanf("%d%d", &a, &b);
int l = , r = , mid;
while (r >= l){
mid = (l + r) >> ;
if (1LL * mid*mid*mid >= 1LL * a*b){
r = mid - ;
}
else{
l = mid + ;
}
}
int k = l;
if ((1LL * k*k*k == 1LL * a*b) && (a%k == ) && (b%k == )){
printf("Yes\n");
}
else{
printf("No\n");
}
}
}
return ;
}

最新文章

  1. Oracle转MySQL
  2. berkeley db 内存池分配机制
  3. mysql本地可以访问 网络不能访问
  4. 微信小程序开放公测了 晚上又可以通宵搞代码了
  5. Eclipse相关设置
  6. Radeon HD 7850 vs Radeon R9 270X
  7. cadence 焊盘制作小结
  8. sql - 查询所有表中包含指定值
  9. JS事件监听 JS:attachEvent和addEventListener 使用方法
  10. OOP中的多态
  11. 正确使用#include和前置声明(forward declaration)
  12. UVa 481 - What Goes Up
  13. POSIX-Data Structure
  14. VS2012统计代码量
  15. 廖雪峰Java6IO编程-2input和output-1inputStream
  16. 在微信小程序中引入 Iconfont 阿里巴巴图标库
  17. [cb]UIGrid+UIStretch的自适应
  18. 【Linux】进程优先级、进程nice值和%nice
  19. Layouts
  20. [BZOJ 4809] 相逢是问候

热门文章

  1. DeepFaceLab 模型预训练参数Pretrain的使用!
  2. C# 读写App.config 配置文件
  3. 在SOUI3.0中使用数值动画
  4. vue 表格组件分享
  5. lua源码学习篇一:环境部署
  6. Python 2 和 3 的区别及兼容技巧
  7. CSS样式div
  8. flutter 处理dialog点击事件回调
  9. bug大致分类及如何定位
  10. java基础/java调用shell命令和脚本