D - Sum of Large Numbers
题意:
要你求出有多少种 “sum的” 组合。
思路:
- 根据题意,把问题转换成求:有多少个[0,N]的sum。
- 当n=3,k=2时,下面来找规律。
- 选两个时有(0,1)(0,2)(0,3)(1,3)(2,3)
其中(1,2)和(0,3)相同,所以不考虑。(这里最小sum是1,最大sum是5,并且有5个) - 选三个时有 (0,1,2)(0,1,3)(0,2,3)(1,2,3)
(这里sum最小是3,最大是6,并且有4个) - 选四个时(0,1,2,3)
(这里sum最小是6,最大也是6,并且有1个) - 综上可发现每次都是max_sum - min_sum+1.
- 所以从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;
}