Wannafly Winter Camp 2020 Day 5F Inversion Pairs - 拉格朗日插值,dp
给定 \(n \leq 10^7\),求所有 \(n\) 的全排列的逆序对个数的 \(k \leq 100\) 次方和
Solution
\(f[i][j]\) 表示 \(i\) 个元素,逆序对个数为 \(j\) 的全排列个数,则
\]
设 \(g[i]\) 为 \(n=i\) 的答案,那么
\]
暴力计算则复杂度 \(O(n^3)\)
然而我们发现 \(g[i]/{i!}\) 是一个 \(2k\) 次多项式,于是我们计算出前 \(2k\) 项然后拉格朗日插值即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 205;
const int mod = 1e9+7;
int qpow(int a,int x) {
int ret=1,nww=a;
while(x) {
if(x&1)ret=ret*nww%mod;
nww=nww*nww%mod;
x>>=1;
}
return ret;
}
int inv(int x) {
return qpow(x,mod-2);
}
int frac(int x) {
int ans=1;
for(int i=2;i<=x;i++) {
ans*=i; ans%=mod;
}
return ans;
}
namespace lag {
int n,k,x[N],y[N],ans,s1,s2;
int solve(int _k) {
k=_k;
ans=0;
for(int i=1; i<=n; i++) {
s1=y[i]%mod;
s2=1;
for(int j=1; j<=n; j++) if(i!=j)
s1=s1*((k-x[j])%mod+mod)%mod,s2=s2*((x[i]-x[j]%mod)%mod+mod)%mod;
ans+=s1*inv(s2)%mod;
ans=(ans+mod)%mod;
}
return ans;
}
}
int n,k,f[N][N*100],g[N];
signed main() {
cin>>n>>k;
f[0][0]=1;
for(int i=1;i<=min(n,2*k);i++) {
for(int j=0;j<=i*(i-1)/2;j++) {
for(int s=0;s<=i-1;s++) {
f[i][j]+=f[i-1][j-s];
f[i][j]%=mod;
}
g[i]+=f[i][j]*qpow(j,k);
g[i]%=mod;
}
}
if(n<=2*k) cout<<g[n];
else {
for(int i=0;i<=2*k;i++) {
lag::x[i+1]=i;
lag::y[i+1]=(g[i]*inv(frac(i))%mod);
}
lag::n=2*k+1;
cout<<(lag::solve(n)*frac(n)%mod);
}
}
Wannafly Winter Camp 2020 Day 5F Inversion Pairs - 拉格朗日插值,dp的更多相关文章
- Wannafly Winter Camp 2020 Day 5C Self-Adjusting Segment Tree - 区间dp,线段树
给定 \(m\) 个询问,每个询问是一个区间 \([l,r]\),你需要通过自由地设定每个节点的 \(mid\),设计一种"自适应线段树",使得在这个线段树上跑这 \(m\) 个区 ...
- Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学
神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...
- Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学
于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = ...
- Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组
给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...
- Wannafly Winter Camp 2020 Day 6J K重排列 - dp
求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...
- Wannafly Winter Camp 2020 Day 6I 变大! - dp
给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...
- Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分
给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\s ...
- Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心
对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...
- Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学
给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...
随机推荐
- Codeforces_832
A.判断n/k的奇偶性. #include<bits/stdc++.h> using namespace std; long long n,k; int main() { ios::syn ...
- EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)
题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这 ...
- MingGW Posix VS Win32 - 明瓜娃的毒因
MinGW-posix和win32纠缠的瓜娃子 官方首席佛偈(SourceForge)的官网下载页 法克油啊,让我一个小白情何以堪. 盘TA wiki posix wiki中文-UNIX API标准 ...
- Transformer 详解
感谢:https://www.jianshu.com/p/04b6dd396d62 Transformer模型由<Attention is all your need>论文中提出,在seq ...
- bat脚本 定时删除备份的文件
删除 D:\yswbak 目录下rar类型 6天前的 文件 @echo off forfiles /p D:\yswbak /m *.rar /d - /c "cmd /c del @pat ...
- 【STM32H7教程】第62章 STM32H7的MDMA,DMA2D和通用DMA性能比较
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第62章 STM32H7的MDMA,DMA2D和通 ...
- C#后台异步消息队列实现
简介 基于生产者消费者模式,我们可以开发出线程安全的异步消息队列. 知识储备 什么是生产者消费者模式? 为了方便理解,我们暂时将它理解为垃圾的产生到结束的过程. 简单来说,多住户产生垃圾(生产者)将垃 ...
- SAP 如何看某个TR是否传入了Q或者P系统?
SAP 如何看某个TR是否传入了Q或者P系统? 两种方式可以查询. 1)进入Q系统或者P系统.SE16,看表TPALOG, 输入请求号码, 执行,看记录里的字段TPSTAT_KEY是否为空,如果不为空 ...
- Linux Samba文件共享服务,安装与案例配置
Samba服务器安装和配置 1:安装Samba服务器软件包 [root@localhost ~]# rpm -qa | grep samba [root@localhost ~]# yum -y in ...
- centos5,6的GRUB简介
grub:GRand Unified Bootloader grub 0.x:grub legacy(centos5,6) grub 1.x:grub2(centos7) grub legacy(gr ...