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

hamayanhamayan's blog

じょうよ [yukicoder No.836]

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

解説

https://yukicoder.me/submissions/352484

自分はライブラリにしてあるので、貼るだけ。
countMultiple(L, R, div, mod) := [L,R]の間の数でdivで割ったときの剰余がmodである個数
これを作るが、区間の数を[L,R] = [0,R] - [0,L)として計算するテクを使うと、
countMultiple(R, div, mod) := [0,R]の間の数でdivで割ったときの剰余がmodである個数
が作れればいい。
これは割り算を使えば計算可能。
でも、境界条件とかちょっと考えるところがあるので、ライブラリ化しておこう。

ll L, R, N;
//---------------------------------------------------------------------------------------------------
ll countMultiple(ll R, ll div, ll mod) {
	if (R == 0) return 0;

	ll res = R / div;
	if (mod <= R % div and 0 < mod) res++;
	return res;
}
ll countMultiple(ll L, ll R, ll div, ll mod) { // [L,R] and x % div == mod
	return countMultiple(R, div, mod) - countMultiple(L - 1, div, mod);
}

void _main() {
	cin >> L >> R >> N;

	rep(mo, 0, N) printf("%lld\n", countMultiple(L, R, N, mo));
}