結果

問題 No.3245 Payment with 8-rep Currency
ユーザー askr58
提出日時 2025-08-22 22:38:40
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 656 ms / 2,000 ms
コード長 1,049 bytes
コンパイル時間 3,093 ms
コンパイル使用メモリ 286,316 KB
実行使用メモリ 7,720 KB
最終ジャッジ日時 2025-08-22 22:38:57
合計ジャッジ時間 16,690 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll=long long;

int main(){
	int ttt;
	cin>>ttt;
	map<int,vector<int>> mp;
	for(int i=0;i<1111;i++)for(int j=0;j<111;j++)for(int k=0;k<11;k++){
		int s=i+j+k;
		if(2*i<s&&2*j<s&&2*k<s){
			mp[i+11*j+111*k]=vector<int>({i,j,k});
		}
	}
	while(ttt--){
		ll n;
		cin>>n;
		if(n%8!=0){
			cout<<-1<<endl;
			continue;
		}
		n/=8;
		if(n<1111){
			if(!mp.count(n))cout<<-1<<endl;
			else {
				auto v=mp[n];
				cout<<v[0]<<" "<<v[1]<<" "<<v[2]<<" "<<0<<endl;
			}
		}else{
			ll nn=n;
			ll d=n/1111-1;
			n%=1111;
			ll c=n/111;
			n%=111;
			ll b=n/11;
			n%=11;
			ll a=n;
			n=nn;
			bool ok=false;
			assert(a+11*b+111*c+1111*(d+1)==n);
			for(int i=0;i<20;i++)for(int j=0;j<20;j++)for(int k=0;k<20;k++){
				if(ok)break;
				if(i+11*j+111*k!=1111)continue;
				int s=a+i+b+j+c+k;
				if(2*(a+i)<s&&2*(b+j)<s&&2*(c+k)<s){
					ok=true;
					a+=i;
					b+=j;
					c+=k;
				}
			}
			a+=d*13;
			b+=d*9;
			c+=d*9;
			assert(a+11*b+111*c==n);
			cout<<a<<" "<<b<<" "<<c<<" "<<0<<endl;
		}
	}
}

		
0