Loading

CSP 后多校六

A. 按位或

应该是道签到题.

A_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS{
	#define int long long
	#define lf long double
	#define pb push_back
	#define mp make_pair
	#define lb lower_bound
	#define ub upper_bound
	#define lbt(x) ((x)&(-(x)))
	#define Fill(x,y) memset(x,y,sizeof(x))
	#define Copy(x,y) memcpy(x,y,sizeof(x))
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	auto read=[]()->int{
		int w=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0;
		while(isdigit(ch)) w=(w<<3)+(w<<1)+(ch^48),ch=getchar();
		return cit?w:(-w);
	};
} using namespace BSS;

const int N=105,mod=998244353;

int m,n,os,ns,ans,lg2,alls;
int dp[2][N],C[N][N];
auto ksm=[](int a,int b,int c,int w=1)->int{
	for(a%=c,b%=(c-1);b;b>>=1,a=a*a%c) if(b&1) w=w*a%c;
	return w%c;
};
auto calc=[](int is,int js)->int{
	Fill(dp,0); dp[0][0]=1;
	for(int i=1,x=1;i<=is;i++,x^=1){
		dp[x][2]=dp[x^1][1]+dp[x^1][2];
		dp[x][1]=dp[x^1][0]+dp[x^1][1];
		dp[x][0]=dp[x^1][2]+dp[x^1][0];
	}
	for(int i=1,x=(is&1)^1;i<=js;i++,x^=1){
		dp[x][2]=dp[x^1][0]+dp[x^1][2];
		dp[x][1]=dp[x^1][2]+dp[x^1][1];
		dp[x][0]=dp[x^1][1]+dp[x^1][0];
	}
	return dp[(is+js)&1][0];
};
signed main(){
	File(or);
	n=read(),m=read(),lg2=log2(m)+1; int x,y,z;
	for(int i=1;i<=lg2;i++){
		if((m>>i-1ll)&1ll) os+=(i&1),ns+=(!(i&1));
	} 
	for(int i=0;i<=100;i++){
		C[i][0]=1;
		for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	}
	for(int i=os+ns,wi=1;i>=0;i--,wi*=-1){
		for(int j=max(0ll,i-ns),k=i-j;j<=os and k>=0;j++,k--){
			ans=(ans+C[os][j]*C[ns][k]%mod*ksm(calc(j,k),n,mod)%mod*wi+mod)%mod;
		}
	}
	printf("%lld\n",ans),exit(0);
}

B. 最短路径

虚树,鸽了.

C. 仙人掌

仙人掌,鸽了.

D. 对弈

\(NIM-K\) 鸽了.

posted @ 2021-11-02 15:11  AaMuXiiiiii  阅读(59)  评论(4编辑  收藏  举报