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次好的。

思路整理

由题意整理关键信息如下

  1. 次好的数一定都是A的倍数
  2. 好的数一定是A*B的倍数
  3. 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 几道题目

Codeforces比赛注意事项(英语比较好,能翻译题目的可以跳过此文章)

Codeforces Round #501 (Div. 3) 翻船记

codeforces 1140E Palindrome-less Arrays