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\) 鸽了.