【組合數】微信羣 @upcexam6016

時間限制: 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 = ni=kCin

根據組合數的性質 ni=0Cin = 2n

所以ans = 2n - k1i=0Cin

而由Cmn = Cm1nnm+1m

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