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