kmjp's blog

競技プログラミング参加記です

Codeforces #277.5 Div2 C. Given Length and Sum of Digits...

CF277.5に参加。
残念ながら苦手なタイプの問題のEが解けなかったが、それ以外はそこそこの時間で解けてまぁまぁの順位。
http://codeforces.com/contest/489/problem/C

問題

整数MとSが与えられる。
M桁で各桁の合計がSであるような数値のうち、最大値と最小値を答えよ。

解法

先にコーナーケースとしてS==0の時を処理しておく。
M>1だと条件を満たす数値は存在せず、M==1なら最大値も最小値も0である。

S>0の場合、最大値は上の桁から9を埋めていけば良い。
最小値は逆に下の桁から9を埋めていけば良いが、leading zeroは認められないので、先頭桁も最低1は残すようにしておく。

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

#undef _P
#define _P(...) (void)printf(__VA_ARGS__)
#define FOR(x,to) for(x=0;x<to;x++)
#define ITR(x,c) for(__typeof(c.begin()) x=c.begin();x!=c.end();x++)
#define ALL(a) (a.begin()),(a.end())
#define ZERO(a) memset(a,0,sizeof(a))
#define MINUS(a) memset(a,0xff,sizeof(a))
//-------------------------------------------------------

int M,S;
char hoge[2][101];
void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>M>>S;
	if(S==0) {
		if(M==1) return _P("0 0\n");
		else return _P("-1 -1\n");
	}
	
	ZERO(hoge);
	x=S;
	FOR(i,M) hoge[0][i]='0'+min(9,x), x-=min(9,x);
	if(x>0) return _P("-1 -1\n");
	
	x=S-1;
	for(i=M-1;i>=0;i--) hoge[1][i]='0'+min(9,x), x-=min(9,x);
	hoge[1][0]++;
	_P("%s %s\n",hoge[1],hoge[0]);
}


int main(int argc,char** argv){
	string s;int i;
	if(argc==1) ios::sync_with_stdio(false);
	FOR(i,argc-1) s+=argv[i+1],s+='\n';
	FOR(i,s.size()) ungetc(s[s.size()-1-i],stdin);
	solve(); return 0;
}

まとめ

C問題の割に簡単。