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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值