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)); }