测试样例:
样例输入
2 0
2 1
2 2
样例输出
998244352
0
2
今天的西安赛区真的比较坑,完全都是模运算,所以也激起我要学透模运算。
加法模运算: (a+b)%mod=(a%mod+b%mod)%mod
减法模运算: (a-b)%mod=(a%mod-b%mod +mod)%mod
乘法模运算: (a*b)%mod=(a%mod*b%mod)%mod
除法模运算: (a/b)%mod=(a*b^(mod-2))%mod
(B关于mod的逆元就是b^(mod-2))
负数模运算: a%mod=(a%mod+mod)%mod (注意a为负数)
分数模比较难以理解推荐一篇比较好的博客。
http://www.cnblogs.com/dupengcheng/p/5487362.html
此次西安赛区的F题就是对除法模和负数模的运用。
AC代码:
#include<cstdio>
using namespace std;
typedef long long LL;
const LL MOD=998244353;
LL quick_pow(LL y,LL k)
{
LL res = 1;
while (k)
{
if (k & 1)
res=(res* y)%MOD;
y=(y*y)%MOD;
k >>= 1;
}
return res;
}
LL fun1(LL n)
{
LL t=1;
for(LL i=n;i>=1;i--)
t=(t*i)%MOD;
return t;
}
LL fun2(LL n,LL m)
{
LL count=1;
while(n>m)
{
count=(count*n)%MOD;
n=n-2;
}
return count;
}
int main()
{
LL n,m;
while(~scanf("%lld%lld",&n,&m))
{
if(n%2!=m%2||m>n)
{
printf("0\n");
continue;
}
if(m==0)
{
printf("998244352\n");
continue;
}
LL x,y;
x=(n*fun2(n+m-2,n-m))%MOD;
y=fun1(m);
LL a=quick_pow(y,MOD-2);
LL ans=(x*a)%MOD;
if((n-m)/2%2)
ans=(MOD-ans)%MOD;
printf("%lld\n",ans);
}
}