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 先 ...
随机推荐
- js笔记(5)--location的用法
!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g ...
- 【科创人独家】科界CTO林镇南:言必真,行必果,没有尽力而为,只有全力以赴
B2C-->B2B-->O2O-->B2G.从传统电商到电子商务,再到最火医美,最后转入国企,80末的林镇南成长路径有特点:行业跨度大.技能涉猎广.误以为"4点半下班&qu ...
- WeChall_Training: Encodings I (Training, Encoding)
We intercepted this message from one challenger to another, maybe you can find out what they were ta ...
- 牛客练习赛34 D little w and Exchange(归纳)
题意: 给n个数,和m 问这组数是否可以构成[1, m]中的每一个数 思路: 先将a数组排序. 先算算构成前几个数需要什么,至少需要a[1]=1 需要a[2] = 1,2 在a[2] = 1的情况下a ...
- Go语言实现:【剑指offer】平衡二叉树
该题目来源于牛客网<剑指offer>专题. 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. ...
- Jdk14 都要出了,Jdk9 的新特性还不了解一下?
Java 9 中最大的亮点是 Java 平台模块化的引入,以及模块化 JDK.但是 Java 9 还有很多其他新功能,这篇文字会将重点介绍开发人员特别感兴趣的几种功能. 这篇文章也是 Java 新特性 ...
- Jmeter之设置动态关联
前言 在Jmeter中,如何进行接口关联(上一个接口的返回参数作为下一个接口的入参使用)测试呢?下面我们一起来学习吧! 需求:需要利用商品信息接口的返回结果skuName值作为下一个登录接口参数Use ...
- ELK-图示nginx中ip的地理位置
一.环境准备: ELK stack 环境一套 geolite数据库文件 二.下载geolite数据库(logstash机器上解压,logstash需调用): geolite官网:https://dev ...
- Angular解析json
一. 解析本地Json数据并展示(待定) 1. 创建服务{ 创建一个接口对象用于接收Json数据 通过HttpClient获得本地Json文件 } 2. 组件中引入服务调用服务方法拿文件用subscr ...
- PHP独立环境配置
php 下载地址: http://windows.php.net/download/ Apache 下载地址: http://www.apachelounge.com/download/ mysql ...