题意

对于序列 a a a,记 v i v_i vi​ 为位置距离 a i a_i ai​ 最近的、比 a i a_i ai​ 大的数与它的距离(假设 a 0 a_0 a0​ 和 a n + 1 a_{n+1} an+1​ 都为无穷大)。

T T T 次询问,给定 n , x n,x n,x,求有多少长度为 n n n 的排列 p p p 使得 ∑ i = 1 n v i = x \sum\limits_{i=1}^nv_i=x i=1∑n​vi​=x。答案对给定的质数 P P P 取模。 n ≤ 200 n\leq 200 n≤200, T ≤ 10 T\leq 10 T≤10。

题解

记 F i F_i Fi​ 为长为 i i i 的排列的生成函数,系数为 ∑ v i \sum v_i ∑vi​。通过枚举最大值的位置容易通过 F 0 ∼ F i − 1 F_0\sim F_{i-1} F0​∼Fi−1​ 得到 F i F_i Fi​。

冷静打表分析一波可知 ∑ v i \sum v_i ∑vi​ 最大是 O ( n log ⁡ n ) O(n\log n) O(nlogn) 的,记 max ⁡ ∑ v i \max{\sum v_i} max∑vi​ 为 V V V。

用 F i F_i Fi​ 的从 1 到 V + 1 V+1 V+1 的点值来计算,转移的总复杂度为 n l o g n n^log n nlogn。

每次询问随便拉格朗日插值一下,单次询问复杂度为 n 2 log ⁡ n n^2\log n n2logn

代码:

#include<bits/stdc++.h>
using namespace std;
int getint(){int ans=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}return ans*f;
}
const int V=750,N=210;
int mod=0;
int queryn[20],queryx[20];
int maxv[N];
int p[V][V];
int f[N][V];
int inv[V];
int c[N][N];
int pre[V][V],suf[V][V];//\prod (x-i)int qpow(int x,int y){int ans=1;while(y){if(y&1)ans=ans*1ll*x%mod;x=x*1ll*x%mod;y>>=1;}return ans;
}void init(int n,int v){for(int i=0;i<=v;i++){p[i][0]=1;for(int j=1;j<=v;j++){p[i][j]=p[i][j-1]*1ll*i%mod;}}c[1][1]=1;for(int i=2;i<=n+1;i++){for(int j=1;j<=i;j++){c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;}}for(int i=0;i<=n;i++)for(int j=0;j<=i;j++)c[i][j]=c[i+1][j+1];for(int i=1;i<=v;i++)inv[i]=qpow(i,mod-2);for(int i=1;i<=v;i++)f[0][i]=1,f[1][i]=i;for(int i=2;i<=n;i++){for(int j=1;j<=i/2;j++){//x^j f(j-1)f(i-j) C(i-1,j-1)for(int k=1;k<=v;k++){f[i][k]=(f[i][k]+p[k][j]*2ll*f[j-1][k]%mod*f[i-j][k]%mod%mod*c[i-1][j-1])%mod;}}if(i&1){int j=(i+1)>>1;for(int k=1;k<=v;k++){f[i][k]=(f[i][k]+p[k][j]*1ll*f[j-1][k]%mod*f[i-j][k]%mod*c[i-1][j-1])%mod;}}//for(int j=1;j<=v;j++)cerr<<" "<<f[i][j];cerr<<endl;}pre[0][0]=1;for(int i=1;i<=v;i++){pre[i][0]=1;for(int j=1;j<=i;j++){pre[i][j]=(pre[i-1][j]+pre[i-1][j-1]*1ll*(mod-i))%mod;}}suf[v+1][0]=1;for(int i=v;i>=1;--i){suf[i][0]=1;for(int j=1;j<=v-i+1;j++){suf[i][j]=(suf[i+1][j]+suf[i+1][j-1]*1ll*(mod-i))%mod;}}
}int calc(int m,int p){int ans=0;for(int i=0;i<=m;i++){ans=(ans+pre[p-1][i]*1ll*suf[p+1][m-i])%mod;}return ans;
}
int solve(int n,int x,int lim){if(x>maxv[n])return 0;int res=0,p=0;for(int i=1;i<=lim;i++){p=f[n][i];//yfor(int j=1;j<=lim;j++){if(i==j)continue;p=p*1ll*(i>j?inv[i-j]:mod-inv[j-i])%mod;}res=(res+p*1ll*calc(lim-x-1,i))%mod;}return res;
}signed main(){mod=getint();int q=0;while(cin>>queryn[q]>>queryx[q])q++;int mxn=0,mxx=0;for(int i=0;i<q;i++){mxn=max(mxn,queryn[i]);mxx=max(mxx,queryx[i]);}maxv[1]=1;for(int i=2;i<=mxn;i++)for(int j=1;j<=i;j++)maxv[i]=max(maxv[i],maxv[j-1]+maxv[i-j]+min(j,i-j+1));mxx=maxv[mxn]+1;init(mxn,mxx);for(int i=0;i<q;i++){int n=queryn[i],x=queryx[i];printf("%d\n",solve(n,x,mxx));}return 0;
}

某 SCOI 模拟赛 T3 s3mple【生成函数 拉格朗日插值】相关推荐

  1. 省选模拟赛记录(越往下越新哦~~~)

    LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...

  2. 2017.6.11 校内模拟赛

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

  3. ssl提高组周六模拟赛【2018.9.8】

    前言 开学后,新学年新气象,学校题库也迎来了新的改动,界面大改变,也可以比赛了. 所以这周就有比赛了,而在纪中被虐习惯后回来渴望继续被虐就来参加提高组模拟赛(反正今年也参加提高组) 成绩 只放Rank ...

  4. 2019.01.22【NOIP普及组】模拟赛C组总结

    总结 这次模拟赛拿到了100+100+100+60=360的分数 第1,2题不怎么难,快速解决,第3题看到之后马上想到了混合背包,打了大概半小时解决了,最后一道题想来想去,想了一堆没用的东西,最后打了 ...

  5. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  6. 9.11 myl模拟赛

    9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...

  7. NOIP模拟赛 17.10.10

    初次见面(firstmeet) [题目背景] 雾之湖边,静得可怕. 露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之 湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她 ...

  8. [CSP冲刺班]CSP-J2021模拟赛#9

    !!!爆零警告 得分 凄凄惨惨戚戚 我上来浏览了一遍题目,觉得都挺简单的(事实证明我太年轻了),挑了我认为最简单的第二题开始做,做了半个小时,A掉了.然后做第二题,拿了部分分(无嵌套30分).第三题写 ...

  9. 2021.08.09【普及组】模拟赛C组比赛总结

    文章目录 2021.08.09[普及组]模拟赛C组比赛总结 写在前面: T1 :[普及模拟]生产武器 题目大意: 正解: T2 :[普及模拟]城市连接 题目大意: 正解: T3 :[普及模拟]抢救文件 ...

最新文章

  1. 如何实现Word、PDF,TXT文件的全文内容检索?
  2. 模型评估——ROC、KS
  3. oracle查询中表的连接顺序 手工指定
  4. OpenCV Cut Image via ROI 根据兴趣区域剪裁图片
  5. STL源码剖析 关联式容器 红黑树
  6. (转)十分钟搞定你自己的多图片/文件服务器
  7. centos7 ACL
  8. linux 显存占用内存,Linux服务器内存、CPU、显卡、硬盘使用情况查看
  9. win7一直显示正在关机_当办公场所没有WIFI,有网线,笔记本如何在 win7建立无线网络...
  10. SICNU ACM新生第一次考核
  11. python画正方形-用python画正方形
  12. ubuntu安装好matlab后键盘复制粘贴快捷键不能使用 解决办法
  13. 1_Qt的介绍和开始
  14. 百度java面试题(一)2020整理
  15. mysql pga_PGA的监控与调整
  16. Git安装教程(超详细教程)
  17. python输入一个数输出绝对值_python如何使用绝对值
  18. ROS1云课-导航实践测评
  19. C语言-switch-case语句与多分支结构
  20. 一个轻巧强大的模拟服务器接口桌面软件

热门文章

  1. Netflix Conductor 简单demo
  2. 10种锻炼思维的方法,让你大脑更强大!
  3. [支付]支付宝支付(网银在线支付)
  4. 对短视频寄予厚望,但市场还有微博的席位吗?
  5. textarea宽度、高度自动适应处理方法
  6. 运营商IT“铸剑之道”
  7. CCNP——P2P网络(点对点网络)类型的OSPF的特点
  8. 阿尔·里斯-市场营销的22条法则(22条商规)-15
  9. WinRAR制作有密码的自解压文件
  10. Numpy中的广播和数组运算