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; }