3626. 三元一次方程(Acwing)

给定一个整数 n,请你求出三元一次方程 3x+5y+7z=n 的一组非负整数解。

要求:

  1. x≥0,y≥0,z≥0
  2. 如果解不唯一,则输出 x,y,z 字典序最小的解。

输入格式

第一行包含一个整数 T,表示共有 T 组测试数据。

每组数据占一行,包含一个整数 n。

输出格式

每组数据输出一行结果,如果无解则输出 −1,否则输出 x,y,z,整数之间单个空格隔开。

数据范围

对于前三个测试点,1≤n≤100。
对于全部测试点1≤n≤10001≤n≤1000。

输入样例:

4
30
67
4
14

输出样例:

0 6 0
0 5 6
-1
0 0 2

 比较字典序最小,从前往后比较,因此需要把前面的尽量最小

#include<iostream>
using namespace std;
int main(){
    int T,n;
    cin>>T;
    while(T--){
        cin>>n;
        if(n==4||n<3){
            cout<<-1<<endl;
            continue;
        }
            int t=0;
            for(int i=0;i<=n/3;i++){
                for(int j=0;j<=n/5;j++){
                    if((n-3*i-5*j)%7==0){
                        cout<<i<<" "<<j<<" "<<(n-3*i-5*j)/7<<endl;
                        t=1;
                        break;
                    }
                }
            if(t==1)break;         //如果有解后就退出循环减少计算量 
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值