链接
知识点
构造,思维,数学
思路
1.因为题目要求 1 =< A, B,C <= ,所以 A · B + C 最小为 2,若X = 1,则一定无解。
2.如果 X <= + 1,说明一定有一种构造方法使得 B=C =1,A=X - C满足题日要求,由于 B,C 都已经是最小的1 了,所以三元组(B,C,A)的字典序肯定为最小。
3. 如果 X > + 1,为了让 B 最小,我们让 Á 为最大的
,因为 C 不会大于 A,所以B 的最小值肯定为
。
4.但如果这样计算存在一个问题,若 A 可以整除 X,则此时 C = 0,不满足1 =< C <= 的要求,故在这种情况下让C = A =
,这样可以保证满足要求的情况下(B,C,A)的字典序最小。
代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6;
void solve(){
ll x;
cin>>x;
if(x == 1){
cout<<-1<<endl;
}else{
int a,b,c;
if(x <= N + 1){
b = c = 1;
a = x - c;
}else{
a = N;
c = x % a == 0 ? N : x % a;
b = (x - c) / a;
}
cout<<a<<" "<<b<<" "<<c<<endl;
}
}
int main(){
ll t;
cin>>t;
while(t--){
solve();
}
return 0;
}