AtCoder D - Sum of Large Numbers(前綴後綴維護+找規律)

D - Sum of Large Numbers

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

題意:

要你求出有多少種 “sum的” 組合。

思路:

  1. 根據題意,把問題轉換成求:有多少個[0,N]的sum。
  2. 當n=3,k=2時,下面來找規律。
  3. 選兩個時有(0,1)(0,2)(0,3)(1,3)(2,3)
    其中(1,2)和(0,3)相同,所以不考慮。(這裏最小sum是1,最大sum是5,並且有5個)
  4. 選三個時有 (0,1,2)(0,1,3)(0,2,3)(1,2,3)
    (這裏sum最小是3,最大是6,並且有4個)
  5. 選四個時(0,1,2,3)
    (這裏sum最小是6,最大也是6,並且有1個)
  6. 綜上可發現每次都是max_sum - min_sum+1.
  7. 所以從k開始一直到n+1(包括0,所以是n+1個)累加個數即可。

AC

#include <iostream>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
#define foR(i,x,y) for(register int i=(x); i>=(y); i--)
using namespace std;
const int mod=1e9+7;
const int maxn=2e5+10;
typedef long long ll;
ll pre[maxn],suf[maxn];
int main()
{
    int n,k;
    cin>>n>>k;
    For(i,1,n+1)pre[i]=pre[i-1]+i-1;
    foR(i,n+1,1)suf[i]=suf[i+1]+i-1;
    ll ans=0;
    For(i,k,n+1)
    {
        ans=ans+suf[n+2-i]-pre[i]+1;
        ans%=mod;
    }
    cout<<ans<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章