题目相关

题目链接

题目大意

给定nnn,qqq组询问,每组询问包含x,yx,yx,y,求满足条件的排列aaa数量
条件1:max(a1,a2⋅⋅⋅ay)=aymax(a_1,a_2···a_y)=a_ymax(a1​,a2​⋅⋅⋅ay​)=ay​
条件2: 2ax&lt;ay2a_x&lt;a_y2ax​<ay​

数据范围

1≤n,q≤1000000,1≤x&lt;y≤n1\le n,q\le1000000,1\le x&lt;y\le n1≤n,q≤1000000,1≤x<y≤n

题解

这题的Θ(nlogn)\Theta(nlogn)Θ(nlogn)算法不能过
首先发现,xxx的值无论如何变化答案相同(可以把xxx位看成特殊位)
我们发现直接求并不好做,我们考虑这样一件事情:
如果题目的条件2改为2ax&gt;ay2a_x&gt;a_y2ax​>ay​,那么答案不变
为什么?
我们发现,当aya_yay​确定的时候,对于满足k&lt;ayk&lt;a_yk<ay​的数,满足2k&lt;ay2k&lt;a_y2k<ay​和满足2k&gt;ay2k&gt;a_y2k>ay​的数是一样多的,所以答案也是一样的
设AlessA_{less}Aless​为条件2为2ax&lt;ay2a_x&lt;a_y2ax​<ay​时的答案(即我们要求的),
设AmoreA_{more}Amore​为条件2为2ax&gt;ay2a_x&gt;a_y2ax​>ay​时的答案,
设AequalA_{equal}Aequal​为条件2为2ax=ay2a_x=a_y2ax​=ay​时的答案,
设AnoneA_{none}Anone​为条件2没有时的答案,
容易发现Anone=(ny)(y−1)!(n−y)!=n!y!(n−y)!(y−1)!(n−y)!=n!yA_{none}=\binom{n}{y}(y-1)!(n-y)!=\frac{n!}{y!(n-y)!}(y-1)!(n-y)!=\frac{n!}yAnone​=(yn​)(y−1)!(n−y)!=y!(n−y)!n!​(y−1)!(n−y)!=yn!​
(即取出yyy个数,把最大值作为aya_yay​,再枚举前后的摆放方式,当然也可以用其它方法推)
并且Aless+Amore+Aequal=AnoneA_{less}+A_{more}+A_{equal}=A_{none}Aless​+Amore​+Aequal​=Anone​
由于我们知道Aless=AmoreA_{less}=A_{more}Aless​=Amore​
所以Aless=Anone−Aequal2A_{less}=\frac{A_{none}-A_{equal}}{2}Aless​=2Anone​−Aequal​​
考虑如何求AequalA_{equal}Aequal​
设gig_igi​为y=iy=iy=i时a1⋅⋅⋅aya_1···a_ya1​⋅⋅⋅ay​的选择方案数
容易发现Aequal=gy(y−2)!(n−y)!A_{equal}=g_y(y-2)!(n-y)!Aequal​=gy​(y−2)!(n−y)!
考虑怎么求gig_igi​
gi=∑j=1⌊n2⌋(2j−2i−2)=∑j=0⌊n2⌋−1(2ji)\begin{aligned} g_i&amp;=\sum_{j=1}^{\left\lfloor \frac n2\right\rfloor}\binom{2j-2}{i-2}\\ &amp;=\sum_{j=0}^{\left\lfloor \frac n2\right\rfloor-1}\binom{2j}{i} \end{aligned}gi​​=j=1∑⌊2n​⌋​(i−22j−2​)=j=0∑⌊2n​⌋−1​(i2j​)​
我们将其一般化
假设给定mmm
现在要求的是fn=∑i=0m(2in)f_n=\sum_{i=0}^m\binom{2i}{n}fn​=i=0∑m​(n2i​)
根据经典性质(nm)=(n−1m)+(n−1m−1)\binom nm=\binom{n-1}m+\binom{n-1}{m-1}(mn​)=(mn−1​)+(m−1n−1​)
我们可以将fff进行一些转化
fn=∑i=0m(2in)=∑i=0m((2i−1n−1)+(2i−1n))=∑i=0m(2i−1n−1)+∑i=0m(2i−1n)\begin{aligned} f_n&amp;=\sum_{i=0}^m\binom{2i}{n}\\ &amp;=\sum_{i=0}^m(\binom{2i-1}{n-1}+\binom{2i-1}{n})\\ &amp;=\sum_{i=0}^m\binom{2i-1}{n-1}+\sum_{i=0}^m\binom{2i-1}{n}\\ \end{aligned}fn​​=i=0∑m​(n2i​)=i=0∑m​((n−12i−1​)+(n2i−1​))=i=0∑m​(n−12i−1​)+i=0∑m​(n2i−1​)​
列出组合数的一个经典式子(我们发现这个式子和我们要求的fff非常像
∑i=xy(ix)=(y+1x+1)\sum_{i=x}^y\binom{i}{x}=\binom{y+1}{x+1}i=x∑y​(xi​)=(x+1y+1​)
将两个fnf_nfn​相加
2fn=∑i=0m(2i−1n−1)+∑i=0m(2i−1n)+∑i=0m(2in)=∑i=0m(2i−1n−1)+∑i=0m(2i−1n)+∑i=0m(2in)+fn−1−fn−1=∑i=0m(2i−1n−1)+∑i=0m(2in−1)+∑i=0m(2i−1n)+∑i=0m(2in)−fn−1=∑i=02m(in−1)+∑i=02m(in)−fn−1=(2m+1n)+(2m+1n+1)−fn−1=(2m+2n+1)−fn−1\begin{aligned} 2f_n&amp;=\sum_{i=0}^m\binom{2i-1}{n-1}+\sum_{i=0}^m\binom{2i-1}{n}+\sum_{i=0}^m\binom{2i}{n}\\ &amp;=\sum_{i=0}^m\binom{2i-1}{n-1}+\sum_{i=0}^m\binom{2i-1}{n}+\sum_{i=0}^m\binom{2i}{n}+f_{n-1}-f_{n-1}\\ &amp;=\sum_{i=0}^m\binom{2i-1}{n-1}+\sum_{i=0}^m\binom{2i}{n-1}+\sum_{i=0}^m\binom{2i-1}{n}+\sum_{i=0}^m\binom{2i}{n}-f_{n-1}\\ &amp;=\sum_{i=0}^{2m}\binom i{n-1}+\sum_{i=0}^{2m}\binom i{n}-f_{n-1}\\ &amp;=\binom{2m+1}{n}+\binom{2m+1}{n+1}-f_{n-1}\\ &amp;=\binom{2m+2}{n+1}-f_{n-1}\\ \end{aligned}2fn​​=i=0∑m​(n−12i−1​)+i=0∑m​(n2i−1​)+i=0∑m​(n2i​)=i=0∑m​(n−12i−1​)+i=0∑m​(n2i−1​)+i=0∑m​(n2i​)+fn−1​−fn−1​=i=0∑m​(n−12i−1​)+i=0∑m​(n−12i​)+i=0∑m​(n2i−1​)+i=0∑m​(n2i​)−fn−1​=i=0∑2m​(n−1i​)+i=0∑2m​(ni​)−fn−1​=(n2m+1​)+(n+12m+1​)−fn−1​=(n+12m+2​)−fn−1​​
容易发现m=⌊n2⌋−1m=\left\lfloor \frac n2\right\rfloor-1m=⌊2n​⌋−1
所以gx=(2⌊n2⌋x+1)−gx−12g_x=\frac{\binom{2\left\lfloor \frac n2\right\rfloor}{x+1}-g_{x-1}}2gx​=2(x+12⌊2n​⌋​)−gx−1​​
直接递推即可,预处理组合数,算法总复杂度Θ(n)\Theta(n)Θ(n)

代码

贴上AC代码

#include<cstdio>
#include<cctype>
namespace fast_IO
{const int IN_LEN=10000000,OUT_LEN=10000000;char ibuf[IN_LEN],obuf[OUT_LEN],*ih=ibuf+IN_LEN,*oh=obuf,*lastin=ibuf+IN_LEN,*lastout=obuf+OUT_LEN-1;inline char getchar_(){return (ih==lastin)&&(lastin=(ih=ibuf)+fread(ibuf,1,IN_LEN,stdin),ih==lastin)?EOF:*ih++;}inline void putchar_(const char x){if(oh==lastout)fwrite(obuf,1,oh-obuf,stdout),oh=obuf;*oh++=x;}inline void flush(){fwrite(obuf,1,oh-obuf,stdout);}
}
using namespace fast_IO;
#define getchar() getchar_()
#define putchar(x) putchar_((x))
typedef long long ll;
#define rg register
template <typename T> inline T max(const T a,const T b){return a>b?a:b;}
template <typename T> inline T min(const T a,const T b){return a<b?a:b;}
template <typename T> inline void mind(T&a,const T b){a=a<b?a:b;}
template <typename T> inline void maxd(T&a,const T b){a=a>b?a:b;}
template <typename T> inline T abs(const T a){return a>0?a:-a;}
template <typename T> inline void swap(T&a,T&b){T c=a;a=b;b=c;}
template <typename T> inline void swap(T*a,T*b){T c=a;a=b;b=c;}
template <typename T> inline T gcd(const T a,const T b){if(!b)return a;return gcd(b,a%b);}
template <typename T> inline T square(const T x){return x*x;};
template <typename T> inline void read(T&x)
{char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;
}
template <typename T> void printe(const T x)
{if(x>=10)printe(x/10);putchar(x%10+'0');
}
template <typename T> inline void print(const T x)
{if(x<0)putchar('-'),printe(-x);else printe(x);
}
const int maxn=1000001,mod=998244353;
int fac[maxn],ifac[maxn],inv[maxn];
inline int pow(int x,int y)
{int res=1;for(;y;y>>=1,x=(ll)x*x%mod)if(y&1)res=(ll)x*res%mod;return res;
}
inline int C(const int x,const int y)
{return (ll)fac[x]*ifac[y]%mod*ifac[x-y]%mod;
}
int n,q,f[maxn];
int main()
{fac[0]=1;for(rg int i=1;i<=1000000;i++)fac[i]=(ll)fac[i-1]*i%mod;ifac[1000000]=pow(fac[1000000],mod-2);inv[0]=1;for(rg int i=1000000;i>=1;i--)ifac[i-1]=(ll)ifac[i]*i%mod,inv[i]=(ll)ifac[i]*fac[i-1]%mod;read(n),read(q);const int INV=inv[2];f[0]=n>>1;const int P=(n>>1)<<1;for(rg int i=1;i<=n;i++)f[i]=(ll)INV*(C(P,i+1)+mod-f[i-1])%mod;while(q--){int x,y;read(x),read(y);print(((ll)fac[n]*inv[y]+mod-(ll)f[y-2]*fac[n-y]%mod*fac[y-2]%mod)%mod*INV%mod),putchar('\n');}return flush(),0;
}

总结

常数极小,稳稳的过
弱弱的推式子题(为何很多人都懒得自己推啊),转化问题很巧妙

模拟赛-20190115-permutation相关推荐

  1. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  2. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  3. 2020年蓝桥杯模拟赛2020.3.25直播笔记

    2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...

  4. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  5. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  6. 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】

    蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料)   提取码:6666 2013年 ...

  7. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  8. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  9. 模拟赛-20190114-新魔法(distance)

    前言 第一篇模拟赛题思路总结 题目相关 题目链接 题目大意 给定一个长度为nnn序列,每一个位置iii都有一种颜色aia_iai​ 现在有mmm次操作,操作分两种: 第一种操作,将所有颜色xxx都替换 ...

  10. 3.27模拟赛 sutoringu(后缀数组)

    \(\color{white}{mjt是机房模拟赛独自切过题的唯一的人...}\) (应本人要求删掉惹) \(Description\) 给你\(n,k\)和长为\(n\)的字符串\(s\).一个区间 ...

最新文章

  1. openstack中RemoteError: AgentNotFoundByTypeHost解决
  2. 开发日记-20190808 随便聊聊
  3. nginx运行php如何,ThinkPHP项目在Nginx上运行的配置问题
  4. 异步FIFO的FPGA实现
  5. Nature论文解读:用于改善加权生物网络信噪比的网络增强方法
  6. 如何利用多核CPU提高虚拟现实性能?
  7. python爬虫自动更换ip_Python 爬虫使用动态切换ip防止封杀
  8. 优秀的gdb图形化前端调试器
  9. 文件的上传下载功能的实现(包括进度条)[telerik控件]
  10. oracle数据数形转换db2,DB2数字类型转换成字符串类型,例:ORACLE与DB2
  11. MCS9865串口卡并口卡驱动
  12. 清明假期,超市可重点主推的品类
  13. 道长运维之正则表达式
  14. 焦距、光圈和景深的关系
  15. Python面向对象练习题汇总
  16. [技术发展-24]:现有物联网通信技术特点
  17. linux boot引导修复工具,修复linux的grub2引导(单独/boot,lvm-root)
  18. 银联Pos终端签到、签退、批结算、批上送
  19. 近期一个称重设备微信端开发前端知识点,及使用插件遇到的常见问题
  20. iterm通过代理访问网络

热门文章

  1. 下一代微服务(service Mesh)
  2. Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?
  3. 反射获取私有构造方法并运行
  4. 数据库case when语句
  5. 使用匿名内部类创建线程
  6. Calendar类介绍_获取对象的方式
  7. SpringBoot集成其他技术-集成Redis
  8. 列表-使用del关键字从列表删除数据
  9. java 仿百度文库源码_java开发_模仿百度文库_SWFTools_源码下载
  10. log4j 2.x --LogManager