時間限制: 1 Sec 內存限制: 128 MB
題目描述
衆所周知,一個有着6個人的宿舍可以有7個微信羣(^_^,別問我我也不知道爲什麼),然而事實上這個數字可以更大,因爲每3個或者是更多的人都可以組建一個羣,所以6個人最多可以組建42個不同的羣。
現在,已知一間宿舍有N個人,並且每至少K個人都可以組建一個微信羣,那麼他們最多可以組建多少個不同的微信羣?
輸入
一行兩個整數N和K,表示宿舍中的人數和最少能夠組建微信羣的人數
輸出
一行一個整數,即最多能組建多少個不同的微信羣,由於這個數字很大,請輸出對10^9+7求餘後的結果
樣例輸入
6 3
樣例輸出
42
提示
對於30%的數據,3<=N<=10^3
對於60%的數據,3<=N<=10^6
對於100%的數據,3<=N<=10^9,3<=K<=10^5
題目要求ans =
根據組合數的性質
所以ans =
而由
可以O(N)線性求出ans
#define FILE() freopen("../../in.txt","r",stdin)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxk = 100005;
const ll MOD = 1e9+7;
ll fastpower(ll x,ll n) {
ll res = 1;
while(n) {
if(n&1)res = res*x%MOD;
x = x*x%MOD;
n>>=1;
}
return res;
}
int main() {
//FILE();
ll k,n;
cin>>n>>k;
ll sum = fastpower(2,n),ans=1,tmp=n;
for(int i=2; i<=k; i++) {
ans=(ans+tmp)%MOD;
tmp=((tmp*(n-i+1))%MOD*fastpower(i,MOD-2))%MOD;
}
ans=(sum-ans+MOD)%MOD;
printf("%lld\n",ans);
return 0;
}