ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SPOJ 5973 【SELTEAM - Selecting Teams】

2020-03-21 11:00:44  阅读:370  来源: 互联网

标签:ch int Selecting sum while SPOJ 5973 binom include


前置芝士

二项式定理,组合数

正文

  • 二项式定理

\[(x+y)^n=\sum_{i=0}^{n} \binom{n}{i}x^{n}y^{n-i}\]

带入\(x=y=1\),得

\[2^n=\sum_{i=0}^{n}\binom{n}{i}\]


  • 转化

首先转化,考虑枚举人数,然后先取队长,剩下任意
取。

答案即为

\[\sum_{i=1}^{k}i\binom{n}{i} \sum_{j=0}^{i-1}\binom{i}{j}\]

后面的式子根据刚刚得出的结论,可以替换为\(2^{i-1}\)

所以

\[\texttt{ans} = \sum_{i=1}^{k}i\binom{n}{i}2^{i-1}\]

然后可以发现模数是\(2^{23}\),所以枚举人数只要到23即可。

\(Code\)

#include <iostream>
#include <cstdio>
#include <cstring>
#define int long long 
using namespace std;
inline int read(){
    register int x=0,f=0,ch=getchar();
    while('0'>ch||ch>'9')f^=ch=='-',ch=getchar();
    while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
    return f?-x:x;
}
#define P 8388608
const int MAX=100005; 
int C[MAX][30];
inline void Gcom(){
    for(register int i=0;i<=MAX;++i){
        C[i][0]=1;
        for(register int j=1;j<=23&&j<=i;++j){
            C[i][j]=C[i-1][j]+C[i-1][j-1];
            C[i][j]%=P;
        }
    }
} 
int n,k,t,ans;
signed main(){
    Gcom();
    t=read();
    while(t--){
        ans=0;
        n=read(),k=read();
        for(register int i=1;i<=k&&i<=23;++i){
            ans+=C[n][i]*i%P*(1<<i-1)%P;
            ans%=P;
        }
        printf("%lld\n",ans%P);     
    }

    return 0;
}

标签:ch,int,Selecting,sum,while,SPOJ,5973,binom,include
来源: https://www.cnblogs.com/Lates/p/12537082.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有