A The Artful Expedient:
题意:给出各不相同的N个数 X1~XN Y1~YN
Xi^Yj=Yk或Xi^Yj=Xk 那么pair数+1 ,如果最后pair数为偶,输出Karen 否则输出Ben
思路:异或满足交换律,对于所有Xi^Yj=Yk 均有Xi^Yk=Yj
对于Yk,Yj是Xi^Yj=Yk 的唯一解,因为互不相同
Xi Yi均不为0,不存在Xi^0=Xi的情况
所以所有pair数只能为偶数w
(听说乱搞会超时)
B . The Eternal Immortality:
题意:求a!/b!的最后一位是啥
思路:(a-b)>=10 的情况为0,(a==b)输出1,否则取模10,尾数直接模拟阶乘,
98 103这种数据还要注意一下不是1..加了flag就A了,总感觉不对
(正解:其实a-b>=5就可以输出0了!!其余还是取模10乘)
C.The Intriguing Obsession
题意:三个颜色的群岛数目分别为a,b,c,小岛连线距离均为1,可连可不连
但同颜色小岛之间不能距离为1或2 ,问有多少种连线方式
思路1:仅考虑a,b俩群岛,等价于(a<b)a个不同的小球放入b个不同的盒子
每个盒子至多一个的方案数,球可以放k:0~a个
假设只放k个
情况是C(a,k)*b!/(b-k)! (第一个球可以放b种)(第二个球只有b-1种可以放)
现在k可以取0~a 那么ans=sigma(k:1~a, C(a,k)*b!/(b-k)!)
预处理5000以内阶乘取模,逆元直接求即可,
ab bc ac是独立的,分别求一遍
31ms 100kb
思路2:dp(i,j)=j*dp(i-1,j-1)(取第i个球)+dp(i-1,j)(不取第i个球)
dp(i,0)=dp(0,i)=1
开dp(5000,5000)刚好不爆内存
其实思路1,2式子等价= =然而并不会解二维递推
D题Q神出题,完全不会的说QAQ
AC code:
A:略
B:略
C:
const int N=5005;
const int mod=998244353;
ll fac[N];
ll inv2(ll t) //求t关于p的逆元,注意:t要小于p,最好传参前先把t%p一下
{
return t == 1 ? 1 : (mod - mod / t) * inv2(mod % t) % mod;
}
void initfac()
{
fac[0]=1;
for(int i=1; i<=N; i++)
{
fac[i]=1ll*fac[i-1]*i%mod;
fac[i]%=mod;
}
}
ll solve(ll a,ll b)
{
if(a>b)
{
swap(a,b);
}
ll ans=0;
for(int i=0; i<=a; i++)
{
ans=ans+(fac[a]%mod*fac[b]%mod*inv2(fac[i])%mod*inv2(fac[a-i])%mod*inv2(fac[b-i])%mod)%mod;
//ans%=mod;
}
ans%=mod;//没了这句会WA
return ans;
}
int main()
{
initfac();
ll a,b,c;
cin>>a>>b>>c;
ll ans=1;
ans=ans*solve(a,b)%mod;
ans=ans*solve(c,b)%mod;
ans=ans*solve(a,c)%mod;
cout<<(ans+mod)%mod;
return 0;
}