某 SCOI 模拟赛 T3 s3mple【生成函数 拉格朗日插值】
题意
对于序列 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∑nvi=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【生成函数 拉格朗日插值】相关推荐
- 省选模拟赛记录(越往下越新哦~~~)
LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...
- 2017.6.11 校内模拟赛
题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...
- ssl提高组周六模拟赛【2018.9.8】
前言 开学后,新学年新气象,学校题库也迎来了新的改动,界面大改变,也可以比赛了. 所以这周就有比赛了,而在纪中被虐习惯后回来渴望继续被虐就来参加提高组模拟赛(反正今年也参加提高组) 成绩 只放Rank ...
- 2019.01.22【NOIP普及组】模拟赛C组总结
总结 这次模拟赛拿到了100+100+100+60=360的分数 第1,2题不怎么难,快速解决,第3题看到之后马上想到了混合背包,打了大概半小时解决了,最后一道题想来想去,想了一堆没用的东西,最后打了 ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- 9.11 myl模拟赛
9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...
- NOIP模拟赛 17.10.10
初次见面(firstmeet) [题目背景] 雾之湖边,静得可怕. 露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之 湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她 ...
- [CSP冲刺班]CSP-J2021模拟赛#9
!!!爆零警告 得分 凄凄惨惨戚戚 我上来浏览了一遍题目,觉得都挺简单的(事实证明我太年轻了),挑了我认为最简单的第二题开始做,做了半个小时,A掉了.然后做第二题,拿了部分分(无嵌套30分).第三题写 ...
- 2021.08.09【普及组】模拟赛C组比赛总结
文章目录 2021.08.09[普及组]模拟赛C组比赛总结 写在前面: T1 :[普及模拟]生产武器 题目大意: 正解: T2 :[普及模拟]城市连接 题目大意: 正解: T3 :[普及模拟]抢救文件 ...
最新文章
- 如何实现Word、PDF,TXT文件的全文内容检索?
- 模型评估——ROC、KS
- oracle查询中表的连接顺序 手工指定
- OpenCV Cut Image via ROI 根据兴趣区域剪裁图片
- STL源码剖析 关联式容器 红黑树
- (转)十分钟搞定你自己的多图片/文件服务器
- centos7 ACL
- linux 显存占用内存,Linux服务器内存、CPU、显卡、硬盘使用情况查看
- win7一直显示正在关机_当办公场所没有WIFI,有网线,笔记本如何在 win7建立无线网络...
- SICNU ACM新生第一次考核
- python画正方形-用python画正方形
- ubuntu安装好matlab后键盘复制粘贴快捷键不能使用 解决办法
- 1_Qt的介绍和开始
- 百度java面试题(一)2020整理
- mysql pga_PGA的监控与调整
- Git安装教程(超详细教程)
- python输入一个数输出绝对值_python如何使用绝对值
- ROS1云课-导航实践测评
- C语言-switch-case语句与多分支结构
- 一个轻巧强大的模拟服务器接口桌面软件