【GDOI2017第二轮模拟day2】中位数

来源:互联网 发布:seo 专家 顺丰 编辑:程序博客网 时间:2024/04/28 03:44

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.
0 0