Selecting Teams (组合数)

bbb

尴尬的发现
8388608 = 2 23

于是i从1到23就够了,100010*25 不会超

#include <bits/stdc++.h>
using namespace std ;

#define rep(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define REP(i,a,b) for (int (i)=(a);(i)>=(b);(i)--)
#define Rep(i,x)   for (int (i)=head[x];(i);i=next[i])

#define lowbit(x) ((x)&(-(x)))
#define sqr(x) ((x)*(x))
#define clr(a) memset((a),0,sizeof((a)))
#define ls ((x)<<1)
#define rs ((x)<<1|1)
#define mid (((l)+(r))>>1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second

typedef long long ll ;
const int mod = 8388608 ;

int c[100010][30] ;
int T,n,k ;
int a[30];


inline void judge(){
    freopen("data.txt","r",stdin);
    freopen("data.txt","w",stdout);
}

inline void init(){
    for (int i=0;i<=100000;i++){
        c[i][0]=1;
        for (int j=1;j<=min(i,23);j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
    }
} 

void solve(){
    int ans=0 ;
    for (int i=1;i<=min(k,23);i++){
        ans=(ans+1LL*((1<<(i-1))%mod)*i*c[n][i])%mod;
    }
    printf("%d\n",ans) ;
}

int main(){ 
    init() ;
    scanf("%d",&T) ;
    while(T--){
        scanf("%d%d",&n,&k) ;
        solve() ;
    }
}

猜你喜欢

转载自blog.csdn.net/HQG_AC/article/details/81228626
今日推荐