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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章