CodeForces 1521A 题目翻译+思路详解+样例程序
Posted xiaohajiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 1521A 题目翻译+思路详解+样例程序相关的知识,希望对你有一定的参考价值。
题目
原文描述:
Nastia has 2 positive integers A and B. She defines that:
- The integer is good if it is divisible by A⋅B;
- Otherwise, the integer is nearly good, if it is divisible by A.
For example, if A=6 and B=4, the integers 24 and 72 are good, the integers 6, 660 and 12 are nearly good, the integers 16, 7 are neither good nor nearly good.
Find 3 different positive integers x, y, and z such that exactly one of them is good and the other 2 are nearly good, and x+y=z.
Input:
The first line contains a single integer t (1≤t≤10 000) — the number of test cases.
The first line of each test case contains two integers A and B (1≤A≤106, 1≤B≤106) — numbers that Nastia has.
Output:
For each test case print:
- “YES” and 3 different positive integers x, y, and z (1≤x,y,z≤1018) such that exactly one of them is good and the other 2 are nearly good, and x+y=z.
- “NO” if no answer exists.
You can print each character of “YES” or “NO” in any case.
If there are multiple answers, print any.
input |
---|
3 |
5 3 |
13 2 |
7 11 |
output |
---|
YES 10 50 60 |
YES 169 39 208 |
YES 28 154 182 |
Note:
In the first test case: 60 — good number; 10 and 50 — nearly good numbers.
In the second test case: 208 — good number; 169 and 39 — nearly good numbers.
In the third test case: 154 — good number; 28 and 182 — nearly good numbers.
翻译描述:
Nastia有两个正整数A、B。她做了如下定义:
- 如果一个整数能被A·B整除那么表明它是好的;
- 除此之外,一个整数如果能够被A整除的数就表明它是次好的。
例如,如果A=6并且B=4,那么整数24和72是好的,整数6、660、还有12都是次好的,整数16、7它们既不是好的也不是次好的。
找出3个不同的正整数x、y与z使得其中一个是好的并且另外两个都是次好的,而且x+y=z。
输入:
第一行有一个正数t(1≤t≤10 000) —测试样例的数量。
每个测试样例的第一行都包括两个正数A与B (1≤A≤106, 1≤B≤106) — Nastia拥有的数。
输出:
对于每一个测试样例输出:
- "YES"与三个不同的正整数x,y,z(1≤x,y,z≤1018)使得其中一个整数是好的,另外两个是次好的,并且x+y=z。
- "NO"如果不存在。
你可以在相应的情况输出"YES" 或者 “NO”。
如果答案有许多个,那么输出其中一个。
input |
---|
3 |
5 3 |
13 2 |
7 11 |
output |
---|
YES |
10 50 60 |
YES |
169 39 208 |
YES |
28 154 182 |
提示:
第一个测试样例:60 — 好的;10和50 — 次好的。
第二个测试样例:208 — 好的;169和39 — 次好的。
第三个测试样例:154 — 好的;18和182次好的。
思路整理
由题意整理关键信息如下
- 次好的数一定都是A的倍数
- 好的数一定是A*B的倍数
- x、y、z一定是3个不同的整数
由于在这三个不同的整数里其中一个是好的(能被A*B整除)并且另外两个是次好的(能被A整除),可见A出现的频率特别高于是我们找出这三个数与A的关系。易知x、y、z一定都是A的倍数,且要求其中一个数必须是好的,最简便的就是我们将好的数作为加数或者被加数,因为如果作为和的话就会比较难拼凑,并且A的倍数与A的倍数相加一定为A的倍数如:aA+bA=(a+b)A。故我们在这里选择好的作为被加数,最简单的方法选择A作为加数。
这样的话我们就可以得到一个x+y=z的式子满足上述三个条件了。其中x=A;y=A*B,那么z=A *(B+1)。(注意当B=1的情况,由于给定的数据范围里 1≤B≤106。当B=1时会使得x=y)
数据的类型选择
当然最后我们还需要考虑数据的边界问题。
- 测试样例数t(1≤t≤10 000) ,使用int型即可。
- 输入值A、B (1≤A≤106, 1≤B≤106),使用int型即可。同理x也可使用int型。
- 由于y、z为A与B或(B+1)的成绩,这使得数据超出int型可存储的范围。故我们使用long long来存储。
样例程序
#include<iostream>
using namespace std;
int main() {
int iTest = 0;//测试样例个数
cin >> iTest;
while (iTest--) {
int iA, iB;
cin >> iA;
cin >> iB;
if (iB == 1) { //不考虑B=1的情况,因为当B=1时会使得x=y
cout << "NO" << endl;
continue;
}
cout << "YES" << endl;
long long x = iA, y = iA * iB, z = (iB + 1) * iA;
if (x != y)//判断x与y是否相同,由于B大于1所以不会产生x、y、z都相同的情况
cout << x << ' ' << y << ' ' << z << endl;
}
return 0;
}
以上是关于CodeForces 1521A 题目翻译+思路详解+样例程序的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 1521A 题目翻译+思路详解+样例程序
CodeForces - 1521A Nastia and Nearly Good Numbers
Codeforces比赛注意事项(英语比较好,能翻译题目的可以跳过此文章)