kmjp's blog

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

Codeforces #609 Div1 A. Long Beautiful Integer

頑張ったけどレート増減0だった回。
https://codeforces.com/contest/1268/problem/A

問題

N桁の整数値Xと、正整数Kが与えられる。
X以上の整数のうち、K桁毎に同じ数値を繰り返す最小の値を求めよ。

解法

どこかの桁を増やすすることにすれば、それより下の値は任意に設定できる。
上から順に、桁の値をいじらないと「K桁毎に同じ数値を繰り返す」の条件に反する最初の場所を求め、それ以下の桁を合わせるようにしよう。

もしn桁目がn+m*K桁目より大きい場合、n+m*K桁目をn桁目に合わせ、それ以降の桁は手前の桁に合わせる。
もしn桁目がn+m*K桁目より小さい場合、n桁目をインクリメントし、(n+1)~K桁目は0にしてしまおう。

int N,K;
string S;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N>>K>>S;
	
	int carry=0;
	FOR(i,N) {
		if(S[i]<S[i%K]) break;
		if(S[i]>S[i%K]) {
			carry=1;
			break;
		}
	}
	
	for(i=K-1;i>=0;i--) if(carry) {
		if(S[i]!='9') {
			S[i]++;
			break;
		}
		S[i]='0';
	}
	
	cout<<N<<endl;
	FOR(i,N) cout<<S[i%K];
	cout<<endl;
}

まとめ

ちょっと戸惑う問題。