文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

Repeating Cipher [ Codeforces Round #529 (Div. 3) A ]

codeforces.com


問題

文字列 s が与えられる。
s の 0,2,5,9,14......n 番目 (n<s.length()) を取り出した文字列を出力せよ。


考察

0,2,5,9,14......n は階差数列というらしいです。
この階差数列の一般項は n(n+3)/2 になります。


文字列 s の n(n+3)/2 番目を n=1 から順に取り出すには、ループの条件式を以下のように記述します。


・i*(i+3)/2 < s.length()


コード

void solve (FastScanner in, PrintWriter out) {
	
	int n = in.nextInt();
	String s = in.next();
	StringBuilder sb = new StringBuilder();
	
	for (int i=0; (i*(i+3)/2)<n; i++) {
		sb.append(s.charAt(i*(i+3)/2));
	}
	
	out.println(sb);
	
}

感想

ループの条件式を特殊なものにするパターンはほとんど書いたことがなかったので、いい練習になりました。