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

この記事が気に入ったらサポートをしてみませんか?