2019 计蒜之道 复赛 大熊猫的“树”?

题解:

     先写出最后公式,推导过程以后有时间写,计蒜客官方题解中途开始出错了(不过仅仅是符号问题)。然后这里的C()指的是广义二项式定理。

牛顿二项式定理与生成函数的推荐博客

     ans = (-4)^(N)*(C((K+1)/(-2),N)-2*C(k/(-2),N+1)+2*C((K+1)/(-2),N+1))

#include"bits/stdc++.h"
#define ll long long
using namespace std;
const int MX = 3e5+12;
const int mod = 998244353;
int n,m;
ll f[MX],fodd[MX],inv[MX],invodd[MX],inv2[MX],Inv2,p2[MX];
ll qpow(ll a, ll n){
	ll ret = 1;
	while(n){
		if(n&1) ret = ret*a%mod;
		a = a*a%mod;
		n >>= 1;
	}
	return ret;
}

void upd(ll &x){
	x = ((x%mod)+mod)%mod;
}

void init(){
	Inv2 = qpow(2,mod-2);
	p2[0] = inv2[0] = 1;
	for(int i = 1; i < MX; i++){
		p2[i] = p2[i-1]*2%mod;
		inv2[i] = inv2[i-1]*Inv2%mod;
	}

	f[0] = f[1] = 1;
	for(int i = 2; i < MX; i++) f[i] = f[i-1]*i%mod;
	inv[MX-1] = qpow(f[MX-1],mod-2); 
	for(int i = MX - 2; i >= 0; i--){
		inv[i] = inv[i+1]*(i+1)%mod;
	}

	fodd[1] = 1;
	for(int i = 3; i < MX; i += 2){
		fodd[i] = fodd[i-2]*i%mod;
	}
	invodd[MX-1] = qpow(fodd[MX-1],mod-2);
	for(int i = MX-3; i > 0; i -= 2){
		invodd[i] = invodd[i+2]*(i+2)%mod;
	}
}

ll C(int K, int N){
	if(K&1)	{
		int invk2 = 1;
		if(K == -1) invk2 = -1;
		if(K-2 > 0) invk2 = invodd[K-2]; 
		return fodd[K+2*N-2]*invk2%mod*inv[N]%mod*inv2[N]%mod;
	}
	if(K == 0) return 0;
	return f[K/2-1+N]*inv[K/2-1]%mod*inv[N]%mod;
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
#endif
	int T;
	scanf("%d",&T);
	init();
	while(T--){
		int N,K;
		scanf("%d%d",&N,&K);
		ll ans = (C(K+1,N) - C(K,N+1)*2%mod + C(K-1,N+1)*2%mod + mod)%mod*p2[N*2]%mod;
		printf("%lld\n",ans);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值