我是靠谱客的博主 霸气香烟,这篇文章主要介绍Codeforces Round #426 (Div. 1) A. The Meaningless Game,现在分享给大家,希望可以做个参考。

Problem

定义 one game 有 multiple rounds (might be 0)。对于 every round,胜利的人分数乘以 k2 ,失败的分数乘以 k 。两人在 game 开始是的分数均为 1 。

N 个询问,每组询问 a b 分别代表两人 one game 的最终分数。问该 a b 是否存在可能为真实分数 ?

Limit

1N350000

1a,b109

其中 k 为自然数。

Idea

对于分数 a b 可分别表示成下列形式 :

  • a=k21k2iki+1ki+j
  • b=k1kik2i+1k2i+j

a×b=(k1kiki+1ki+j)3=K3 ,且 a 和 b 一定能被 K 整除。

故二分获取 K=a×b3 (或者通过 std::cbrt() 获取立方根)。判断是否满足上述条件。

Code

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<bits/stdc++.h> using namespace std; long long Sqrt3(long long x) { long long l = 1, r = min(x, (long long)1000000), val, mid; while(l <= r) { mid = (l+r) >> 1; val = mid * mid * mid; if(val > x) r = mid - 1; else if(val < x) l = mid + 1; else return mid; } return -1; } int main() { int n; long long a, b, sumK; scanf("%d", &n); for(int i=1;i<=n;i++) { scanf("%lld %lld", &a, &b); sumK = Sqrt3(a*b); if(sumK == -1) printf("Non"); else { if(a % sumK || b % sumK) printf("Non"); else { a /= sumK; b /= sumK; if(a * b != sumK) printf("Non"); else printf("Yesn"); } } } }

最后

以上就是霸气香烟最近收集整理的关于Codeforces Round #426 (Div. 1) A. The Meaningless Game的全部内容,更多相关Codeforces内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部