はまやんはまやんはまやん

hamayanhamayan's blog

Making Integers [yukicoder No.821]

https://yukicoder.me/problems/no/821

解説

https://yukicoder.me/submissions/343365

☆の割には難しい問題に見える。順位表を見てみると、プロが5分とかで解いている。
ここから導けるのは、エスパーが必要であるということである。
プロが一瞬で思いついた自明な規則性を探していこう。
 
ここでちょっと気になる条件がある。
操作を0回以上K回以下行うという部分である。
K回ぴったしじゃないんだなという所から、ある程度の柔軟性がありそうだとわかる。
エスパーテク「大体全部つくれちゃう」
これが頭をよぎる。
 
大体全部作れちゃうとして、どの数が作れるんだろうというのを実験してみる。

N=3
1 2 3 

K=0のとき1
6

K=1のとき4
6 4 2 0

K=2のとき6
6 4 2 0 -2 -4

K=3のとき7
6 4 2 0 -2 -4 -6

これをみると+3, +2, +1になってる。
怪しすぎる。
エスパーテク「なんか規則性がある」
こっちだったか。

1+(初項N,公差-1,個数Kの等差数列の総和)が答えっぽい。
tousasm(初項,公差,個数) := 初項N,公差-1,個数Kの等差数列の総和
ご丁寧にエスパー検証用サンプルがサンプル2として用意されているので、検証すると出力と合う。
提出してAC証明。

なお、KがNを超えると計算がバグるので、Kの上限はNとしておく。

ll N, K;
//---------------------------------------------------------------------------------------------------
void _main() {
	cin >> N >> K;

	chmin(K, N);

	ll ans = 1 + tousasm(N, -1LL, K);
	cout << ans << endl;
}