Description
Input
Output
Sample Input
3 2
Sample Output
6
Data Constraint
题解
直接做k似乎不好做,所以考虑>=k的方案数,那么最后的答案就是>=k的方案数减去>=k+1的方案数
设>=k的数为1,否则为-1
容易发现如果最中间的一个位置是1而且它旁边的一个也是1的话那么答案一定是1,把这个结论扩展一下,我们发现当从中间开始两边对称且为“1 -1 1 -1 1”的形状,那么答案就是中间的那一个数,如果他不是对称的,那么就找离中间最近的两个连续的1或-1,那么答案就是它,这个也是比较明显的,因为整个图就像是一个倒金字塔的形状,两个连续的会导致在下一层又有两个连续的
那么我们可以先枚举中间的数是1/-1,然后枚举对称的长度,然后就可以通过组合数和一个简单的容斥算出答案了
注意最后要分别乘1,-1个数的阶乘,因为数是可以随便对应1/-1的
贴代码
const md=998244353;
var
i,j,k,n:longint;
ans,x,y,z:int64;
s:array[0..1000005]of int64;
function quickmi(x,y:int64):int64;
var
t1,t2:int64;
begin
t1:=1; t2:=x mod md;
while y>0 do
begin
if y mod 2=1 then t1:=(t1*t2) mod md;
t2:=(t2*t2) mod md;
y:=y div 2;
end;
exit(t1);
end;
function c(x,y:int64):int64;
var
ans:int64;
begin
if x>y then exit(0);
if (x<0) or (y<0) then exit(0);
ans:=quickmi(s[x]*s[y-x],md-2);
ans:=(ans*s[y]) mod md;
exit(ans);
end;
function get(k:longint):int64;
var
ans,t1,t2:int64;
begin
t1:=k-1;
t2:=n-k+1;
ans:=0;
for i:=0 to n div 2-1 do
if i mod 2=0 then
begin
ans:=ans+2*c(t2-2*(i div 2)-2,n-2*i-2);
ans:=(ans-c(t2-2*(i div 2)-3,n-2*i-3)+md) mod md;
end;
for i:=0 to n div 2-1 do
if i mod 2=1 then
begin
ans:=ans+2*c(t2-2*((i+1) div 2)-1,n-2*i-2);
ans:=(ans-c(t2-2*((i+1) div 2)-2,n-2*i-3)+md) mod md;
end;
if t2=t1+1 then inc(ans);
ans:=(ans*s[t1]) mod md;
ans:=(ans*s[t2]) mod md;
exit(ans);
end;
begin
assign(input,'median.in'); reset(input);
assign(output,'median.out'); rewrite(output);
readln(n,k);
s[0]:=1;s[1]:=1;
for i:=2 to n do s[i]:=(s[i-1]*i) mod md;
ans:=ans+get(k);
ans:=(ans-get(k+1)+md) mod md;
writeln(ans);
close(input); close(output);
end.