https://ac.nowcoder.com/acm/contest/6871/A

description:

给出两个数n和k 求是否存在三个数 a,b,c 他们之间两两gcd的值为k 且 a + b + c = n 输出这三个数
不存在则输出 -1 -1 -1

solution:

n k的范围有1e18 暴力不可取。首先由gcd的性质得到 a,b,c都是k的倍数 所有n%k != 0的话肯定是没办法构成的
对于这个k 因为a,b,c都是k的倍数 所以n也是由x个k构成的 显然他们的总倍数是 n/k 我们直接枚举倍数i,j 剩下的倍数就是 n/k - i - j,当他们之间互质时,乘上k后他们之间的gcd值就可以保证是k,这就是我们要的答案,
特别的 当n/k - i - j <= 1时情况除外 因为题目要求a,b,c不能等于k

code:

#include <bits/stdc++.h>

using namespace std;

#define LL long long

int main(){
    ios::sync_with_stdio(false);

    int t;
    cin >> t;

    while(t --){
        LL n,k;
        cin >> n >> k;

        if(n%k){
            cout << "-1 " << "-1 " << "-1" << '\n';
            continue;
        }

        n /= k;

        bool flag = 0;
        for(LL i = 2;i < 105;i ++){
            for(LL j = i + 1;j < 105;j ++){
                LL x = n - i - j;
                if(x < 2)break;
                if(__gcd(i,j) == 1 && __gcd(i,x) == 1 && __gcd(j,x) == 1){
                    flag = 1;
                    cout << i * k << ' ' << j * k << ' ' << x * k << '\n';
                    break;
                }
            }
            if(flag){
                break;
            }
        }

        if(!flag){
            cout << "-1 " << "-1 " << "-1" << '\n';
        }
    }

    return 0;
}