Codeforces Round #720 (Div. 2) A题解
Posted yueshehanjiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #720 (Div. 2) A题解相关的知识,希望对你有一定的参考价值。
这次只做出来了A…
b看情况在补吧…
Nastia and nearly Good Numbers
题意:给定2个数a,b
如果一个数可以被a * b整除的话,就说这个数是好的
如果一个数不能被a*b整除的话,但是可以被a整除的话,就说这个数是接近好的
每次给出一对a,b,求输出3个数,x,y,z 满足 x + y == z 并且其中有2个接近好的数,和一个好的数
思路:首先看t最大是1e6,a,b最大是1e18,所以必须得用o 1或者o logn的时间输出答案
那么,分析一下题意,如果一个数可以被a * b 整除的话 ,
说明它既可以被a整除,也可以被b整除。
那么,我们可以把x,y看成接近好的数,把z看成好的数,这样每次给出a,b
我们只需要找到2个数n,m使得n * a + m * a == a * ( n + m )
并且a * n 和 a * m不能整除b,且n + m 可以整除b
我们怎样找到这个n和m呢
我们可以假设 n + m == b
这样只用在考虑a * n 和 a * m不能整除b,这个条件
考虑一下b的奇偶性
如果b是偶数,要找n和m的话,是不是可以找2个奇数,3和b-3
但是b是2的话,就会有负数,所以我们可以找3和2 * b - 3,这样就不会有负数
在考虑如果b是奇数的话,我们可以找1和b-1,这样一定满足a 和 a * (b - 1)不能整除b
然后在考虑一下,什么时候无解,当b等于1的时候一定无解,在这种情况下,所有的数都是b的倍数,所以就不存在接近好的数
时间复杂度:o t
#include<bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define re register int
typedef long long ll ;
using namespace std;
const int N = 1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
int main()
{
int t ;
cin >> t ;
while(t--)
{
ll a , b ;
scanf("%lld %lld",&a,&b) ;
if(b != 1)
{
puts("YES");
if(b % 2 == 0)
{
cout << a * 3 << " " << a * (2 * b - 3) << " " << a * (3 + 2 * b - 3) << endl;
}
else
{
cout << a * 1 << " " << a * (b - 1) << " " << a * (b) << endl;
}
}
else puts("NO") ;
}
return 0;
}
以上是关于Codeforces Round #720 (Div. 2) A题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #720 (Div. 2)Codeforces-1521ABC
Codeforces Round #720 (Div. 2) ABCDE题解
Codeforces Round #720 (div2) AB
Codeforces Round #720 (Div. 2), B. Nastia and a Good Array
Codeforces Round #720 (Div. 2) A. Nastia and Nearly Good Num