CF1761D Carry Bit 题解
首先很显然有一个
最终答案是
MODINT::MODNUM pw3[2000010];
#define PC_DATA_TYPE long long
const PC_DATA_TYPE PC_MOD=1000000007;
const PC_DATA_TYPE PC_DATA_SIZE=2000010;
PC_DATA_TYPE inv[PC_DATA_SIZE],fact[PC_DATA_SIZE],invfact[PC_DATA_SIZE];
void init_pc(int n){
register int i;
for(inv[0]=0,inv[1]=fact[0]=fact[1]=invfact[0]=invfact[1]=1,i=2;i<=n;++i)
invfact[i]=invfact[i-1]*(inv[i]=PC_MOD-PC_MOD/i*inv[PC_MOD%i]%PC_MOD)%PC_MOD,fact[i]=fact[i-1]*i%PC_MOD;
return;
}
PC_DATA_TYPE A(int n,int m){
if(n<0||m<0||n<m) return 0;
return fact[n]*invfact[n-m]%PC_MOD;
}
PC_DATA_TYPE C(int n,int m){
if(n<0||m<0||n<m) return 0;
return fact[n]*invfact[n-m]%PC_MOD*invfact[m]%PC_MOD;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("name.in", "r", stdin);
freopen("name.out", "w", stdout);
#endif
MODINT::init(1000000007);
register int i;
register MODINT::MODNUM res=0;
int n=read();
int k=read();
init_pc(n*2);
for(i=pw3[0]=1;i<=n*2;++i) pw3[i]=pw3[i-1]*3;
if(k==0) return print(pw3[n]),0;
for(i=1;i<=k;++i){
if(n-i*2>=0) res+=pw3[n-i*2]*C(n-k,i)*C(k-1,i-1);
if(n-i*2+1>=0) res+=pw3[n-i*2+1]*C(n-k,i-1)*C(k-1,i-1);
}
print(res);
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}