jzoj6002. 【PKUWC2019模拟2019.1.15】Permutation (组合数)

题面

题解

设\(lim=(n-1)/2\)(这里是下取整),那么\(x\)位置的值最大不能超过\(lim\),而\(y\)处的值不能小于\(y\),于是有\[Ans=\sum_{i=1}^{lim}\sum_{j=2 i+1}^n(y-2)!{j-2\choose y-2}(n-y)!\]
上式的意思是,枚举\(x\)处的值\(i\)和\(y\)处的值\(j\),那么放在\(y\)前面的数都不能大于\(j\),要从除了\(i,j\)之外的剩下\(j-2\)个数中选出\(y-2\)个,因为顺序无所谓要乘上\((y-2)!\),这后面的数也随便放,所以再乘上一个\((n-y)!\)

\((y-2)!\)和\((n-y)!\)都是常数,提到前面来然后先考虑如何快速计算\(\sum_{j=2i+1}^n{j-2\choose y-2}\),可以拆成两个前缀和相减的形式,为\({n-1\choose y-1}-{2i-1\choose y-1}\),这样我们就可以做到单次询问\(O(n)\)的复杂度了

考虑继续化简,我们要快速计算\[\sum_{i=1}^{lim}({n-1\choose y-1}-{2i-1\choose y-1})\]
前面是个定值,提出来,于是现在需要快速计算\(\sum_{i=1}^{lim}{2i-1\choose y-1}\)

这样看不太清楚,我们把它展开来\[A_{y-1}={1\choose y-1}+{3\choose y-1}+...+{2lim-1\choose y-1}\]
然后考虑另外一个式子\[B_{y-1}={2\choose y-1}+{4\choose y-1}+...+{2lim\choose y-1}\]
有\[A_{y-1}+B_{y-1}={2lim+1\choose y}\]

然后惊奇的发现,\(A\)和\(B\)之间也有联系\[A_{y-1}+A_{y-2}=B_{y-1}\]
所有\[A_{y-1}=\frac{{2lim+1\choose y}-A_{y-2}}{2}\]
边界条件为\(A_0=lim\)

于是\(A\)就可以\(O(n)\)递推了

然后我们就算完了,时间复杂度为\(O(n+q)\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R int res,f=1;R char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){
    if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
    while(z[++Z]=x%10+48,x/=10);
    while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=1e6+5,P=998244353,inv2=499122177;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
    R int res=1;
    for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
    return res;
}
int fac[N],inv[N],A[N];
int n,res,q,x,y,m;
inline int C(R int n,R int m){return m>n?0:1ll*fac[n]*inv[m]%P*inv[n-m]%P;}
int main(){
//  freopen("testdata.in","r",stdin);
    freopen("permutation.in","r",stdin);
    freopen("permutation.out","w",stdout);
    n=read(),q=read();
    inv[0]=fac[0]=1;fp(i,1,n)fac[i]=mul(fac[i-1],i);
    inv[n]=ksm(fac[n],P-2);fd(i,n-1,1)inv[i]=mul(inv[i+1],i+1);
    m=(n-1)/2;A[0]=m;fp(i,1,n)A[i]=mul(dec(C(2*m+1,i+1),A[i-1]),inv2);
    while(q--){
        x=read(),y=read(),res=0;
//      fp(j,1,(n-1)/2)res=add(res,dec(C(n-1,y-1),C(2*j-1,y-1)));
        res=mul(m,C(n-1,y-1)),res=dec(res,A[y-1]);
        res=mul(res,fac[y-2]),res=mul(res,fac[n-y]);
        print(res);
    }
    return Ot(),0;
}

原文地址:https://www.cnblogs.com/bztMinamoto/p/10276665.html

时间: 2024-08-30 13:22:33

jzoj6002. 【PKUWC2019模拟2019.1.15】Permutation (组合数)的相关文章

【谜客帝国】第145届芭比娃娃主擂谜会(2019.01.15)

[谜客帝国]第145届芭比娃娃主擂谜会(2019.01.15) 主持:瓷   计分:默沫 1. 同心十八载,白首居河东(2字2019亚洲杯中国球员)石柯 2. 王朗气极坠地死(3字方位字)骂下马 [注:典据<三国演义>93回,“王朗听罢,气满胸膛,大叫一声,撞死于马下.”] 3. 城头长弓搭白羽(2字宋词人)张翥 4. 重门折屐未曾进(成语)格格不入 [注:重门.折屐,皆为谜格.] 5.“石城古岸头”(2字国家森林公园)圭山 6. 凯撒大帝显露出愤怒(4字<诗经>名句)七月流火 [

【谜客帝国】第148届梦中人主擂谜会(2019.03.15)

[谜客帝国]第148届梦中人主擂谜会(2019.03.15) 主持:瓷    计分:小白 1.夫人囚禁于何处(5字对景点位置咨询语)娘子关在哪 2.找你去战胜排名第二的人(外教练)索尔斯克亚 3.二月里来换新装(莫言小说<蛙>人物)王胆 4.一心除皇上,自然搭上命(科技名词)全息 5.布什更二(货币冠量)一便士 6.“身形婀娜,虽裹在一袭宽大缁衣之中,仍掩不住窈窕娉婷之态”(3字古埃及国王,卷帘格)美尼斯 [注:面为<笑傲江湖>中对仪琳的描写,美尼斯为是埃及第一王朝的开国国王] 7

【谜客帝国】第150届微雨潇潇联想&amp;灯谜谜会(2019.04.15)

[谜客帝国]第150届微雨潇潇联想&灯谜谜会(2019.04.15) 主持:瓷    计分:晶莹 1.山寺桃花始盛开 才了蚕桑才插田 爱与温暖之佳作 布谷声中夏令新 5 人间四月天 2.幽居在深谷 谢娘之风致 貌略逊黛玉 月夜遇梅仙 4 林下美人 3.有三秋桂子 育桃李满园 效我军劲旅 学仲淹咏梅 4 华中师范 [注:华中师范大学校址桂子山] 4.刮目相看吕蒙 回书效仿刘彻 莽夫手不释卷 落架东湖之滨 4 武汉大学 [注:珞珈山原名落架山] 5.有鲈鱼堪脍 一字救千人 巨鸟之羽翼 宋玉之词赋 1

【谜客帝国】第147届月思主擂谜会(2019.02.15)

 [谜客帝国]第147届月思主擂谜会(2019.02.15) 主持计分:东东 1.“人在中天日月间”(9笔字)春/月思 [注:面出陈孚<开平即事二首>,“势超大地山河上,-.”] 2. 玉漏声中烟气袅(3字法国奢侈品牌)YSL/月思 3. 双双相念初相爱(2字著名动漫人物)菜菜/月思 4.“数点燕云州外.雪霜威”(足球用语二,4+3)4132.451/月思 [注:面出余文<相见欢>,“登高望断龙旗,未曾归.几度中原北定,梦依稀.朔风乱,胡尘漫,掩斜晖.-.”] 5.“十载同心如一人

【2019.8.15 慈溪模拟赛 T1】插头(plugin)(二分+贪心)

二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能经过排插数量最大的那些充电器. 所以,我们只要模拟插排插的过程,记录当前深度\(d\).插座数\(t\)即可. 设选择的能经过排插数量恰好为\(d\)的充电器有\(x\)个,则若\(t<x\),显然不合法. 否则,我们将\(x\)个位置插上充电器,其余位置尽可能地插排插,就可以了. 代码 #incl

2019/1/15 批量删除数据库相关数据

目的:删除数据库各个系统his库里的测试soe与故障数据:一.sql执行错误:执行sql:SELECT FROM SOE WHERE sDevCode = 012400000001报错:[SQL Server]将 varchar 转换为数据类型 numeric 时出现算术溢出错误.原因:查看表设计,sDevCode列的类型为varchar(字符串),修改:SELECT FROM SOE WHERE sDevCode = '012400000001' .二.脚本: -- coding:UTF-8

2019.2.15 t2

考虑倒过来计算最短路径长度,设dis[u]表示在最坏情况下,点u到最近的一 个出口的最短路,则p个出口的dis值都是0,答案即为dis[0]. 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cmath> 5 #include <cctype> 6 #include <queue> 7 #include <algorithm&g

PAT 甲级 A1012 (2019/02/15)

1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 struct Stu_info{ 6 int id; //存放 id 的六位整数 7 int score[4]; //存放 C M E A 的(分数)数组 8 }stu[2010]; 9 char course[4] = {'A', 'C', 'M', 'E'}; //将平均分A存在course[0

PAT 甲级 A1062 (2019/02/15)

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> // STL 使用相关的函数需要include进来 4 using namespace std; 5 struct Stu_info{ 6 char id[10]; 7 int de, cai, sum; 8 int flag; 9 }stu[100010]; 10 //此函数返回值为bool型,相应的返回 true 或者 false 11 bool