码迷,mamicode.com
首页 > 其他好文 > 详细

SELTEAM - Selecting Teams题解

时间:2019-11-11 21:12:59      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:printf   using   大于   print   其他   name   const   选择   while   

SELTEAM - Selecting Teams题解

这道题有点坑啊,
首先先化简一下题意吧:
\(n\)个人,你得选至少k个人组成足球队,在从足球队里选出精英队,最后从精英队中选出一位队长,问不同方案有多少种。
假如选\(i\)个人组成足球队,方案为\(C_n^i\)种,从\(i\)个人中选一人做队长,有\(i\)种选择,选出其他精英队的队员,每个人有选、不选两种选择,方案数\(2^{i-1}\)
所以总方案数:\(\sum_{i=k}^n \binom{n}{i}*i*2^{i-1} (\bmod 8388608)\)
到目前为止都很正常,问题来了,如何优化呢?
你会惊奇的发现\(mod=2^23\),当\(i\)大于23时,\(2^{i-1} \bmod 8388608 =0\),所以\(i\)只要枚举到23就行了.

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=8388608,N=1e5+6;
int t,k;
ll n,inv[27],ans=0,c[N][25],pw;
int main(){
   scanf("%d",&t),c[0][0]=1;
   for(int i=1;i<=1e5;++i){
      c[i][0]=1;
      for(int j=1;j<=min(23,i);++j) c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
   }
   while(t--){
     scanf("%lld%d",&n,&k),pw=1,ans=0;
     for(ll i=1;i<=min(23,k);++i) ans=(ans+c[n][i]*i%mod*pw%mod)%mod,pw<<=1ll;
     printf("%lld\n",ans);
   }
   return 0;
}

SELTEAM - Selecting Teams题解

标签:printf   using   大于   print   其他   name   const   选择   while   

原文地址:https://www.cnblogs.com/ljk123-de-bo-ke/p/11838285.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!