D - Sum of Large Numbers
・問題URL
https://atcoder.jp/contests/abc163/tasks/abc163_d
・発想
・10¹⁰⁰?なんだこれ。
・例えばi個取り出す際、その取り出し方を全部調べて何種類あるか…みたいなのは無理。
・解法
・10¹⁰⁰は、Nに対してバチクソでかい。これは、取り出す個数が変わると10¹⁰⁰+iのiが無視出来て、絶対に総和が同じ値にはならないということを意味する。
・となると、0~Nをi個取り出した時の総和の種類を、K≤i≤N+1で、別々に求めて足せばいいが、全探索みたいなのは無理。これは経験済みだが、0~Nを下からi個取り出すと最小、上からi個取り出すと最大になり、総和はこの間の値をすべて取りうる。よって、この(最大値)-(最小値)+1をΣすればいいね。
・ちなみに、計算過程で÷2が出てくると、うっかりそのままMODをつかってWAになる。逆元使ってもいいけど、式変形すると÷2が消えて安心。
・コード
int main() {
//inf=1000000000+7
ll N, K;
cin >> N >> K;
ll ans = 0;
for (int i = K; i <= N + 1; i++) {
ans += i * (N - i + 1) + 1;
ans %= inf;
}
cout << ans % inf << endl;
}