省选专练【2018雅礼集训】立方体Cube

       

困难

虽然当你知道:答案是C(n,m)*2^(n-m)时甚易

如何推出:


观察计算式:

我们知道当你有四个点时,一个点旁边有有两个点,他们分别连接然后为4*2个但是一个点作为起点终点使用两次故除二

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef int INT;
#define int long long
inline void read(int &x){
	x=0;
	char ch=getchar();
	int f=1;
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	x*=f;
}
const int mod=998244353;
int quick_pow(int x,int k){
	int ret=1;
	while(k){
		if(k%2==1){
			ret=(ret*x%mod+mod)%mod;
		}
		x=(x*x%mod+mod)%mod;
		k=k/2;
	}
	return (ret%mod+mod)%mod;
}
const int N=2e5+10;
int fac[N]={};
int inv[N]={};
int Pre(){
	fac[0]=1;
	inv[0]=1;
	for(int i=1;i<N;i++){
		fac[i]=fac[i-1]*i%mod;
	}
//	cout<<fac[N-1];
	inv[N-1]=quick_pow(fac[N-1],mod-2);
//	cout<<inv[N-1];
	for(int i=N-2;i;i--){
//		cout<<inv[i];
		inv[i]=inv[i+1]*(i+1)%mod;
	}
}
int C(int n,int m){
	return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
INT main(){
	Pre();
//	cout<<C(5,1);
	int T;
	read(T);
	while(T--){
		int n,m;
		read(n);
		read(m);
		if(n==m)
			cout<<1<<'\n';
		else 
			cout<<(C(n,m)*quick_pow(2,n-m)%mod+mod)%mod<<'\n';
	}
//	cout<<48545*quick_pow(2,48545-1)%mod;
}

猜你喜欢

转载自blog.csdn.net/fcb_x/article/details/80979796