CF1886A Sum of Three 题解

发布时间 2023-10-13 13:20:59作者: Martian148

Question

给定一个正整数 N ,我们需要找三个不同的整数x,y,z,使得 N = x+y+z,其中下x,y,z不能被三整除

solution

我们把N%3会有一些余数,我们针对余数来讨论,其中我们只关注xyz的余数

  • 如果余数为0
    那么也就可能是1+1+1,或者2+2+2,但是考虑到xyz不同,所以如果 \(xyz\%3\) 相同的话,\(xyz/3\) 肯定不可能相同,所以只有可能是 \(1+4+7=12\) 所以小于 \(12\) 的就不可能了

  • 如果余数为1
    可以分解为 \(1+2+1\) 最小值也就是 \(1+2+4=7\)

  • 如果余数为 \(2\)
    可以分解为 \(1+2+2\) 最小值就是 \(1+2+5=8\)

code

#include<bits/stdc++.h>
#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
    while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}
int T;
int main(){
    // freopen("A.in","r",stdin);
    // freopen("A.out","w",stdout);
    T=read();
    while(T--){
        int n=read(),x,y,z;
        if(n%3==0){
            if(n<12){printf("NO\n");continue;}
            x=1,y=4,z=n-x-y;
        }
        if(n%3==1){
            if(n<7){printf("NO\n");continue;}
            x=1,y=2,z=n-x-y;
        }
        if(n%3==2){
            if(n<8){printf("NO\n");continue;}
            x=1,y=2,z=n-x-y;
        }
        printf("Yes\n%d %d %d\n",x,y,z);
    }
    return 0;
}