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 先 ...
随机推荐
- Powershell下git中文乱码
问题 使用git log查看提交历史, 发现中文的部分出现了乱码, 如图 解决方案 powershell中输入下面的命令 git config --global core.quotepath fals ...
- JavaScript 初学者容易犯的几个错误,你中招没?
JavaScript 是对初学者比较友好的一门编程语言,基本上花个半小时看下语法就能写出能运行的代码.JavaScript 是动态脚本语言,对数据类型没有太多的限制,写起来非常灵活.但正因为如此,初学 ...
- python 类 --导入类
导入类 1.1.导入单个类 如何导入单个类 以上一节为例,编写一个car.py程序 编写一个新程序my_car.py 希望在my.car.py文件中直接使用car.py中的函数,使用from car ...
- 洛谷P1649 【[USACO07OCT]障碍路线Obstacle Course】
题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...
- c++中的 static 关键字
注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...
- Codeforces 1188B Count Pairs (同余+分离变量)
题意: 给一个3e5的数组,求(i,j)对数,使得$(a_i+a_j)(a_i^2+a_j^2)\equiv k\ mod\ p$ 思路: 化简$(a_i^4-a_j^4)\equiv k(a_i-a ...
- 11g与12c启动,关闭RAC
oracle11g 关闭,启动顺序 1.关闭数据库(oracle)srvctl stop database -d rac 2.关闭集群(root)crsctl stop cluster -all 3. ...
- num14---享元模式
案例:
- TCP协议三次握手(通信)
在<计算机网络>一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失 ...
- 2020牛客寒假算法基础集训营4 C : 子段乘积
C:子段乘积 考察点 : 线段树,尺取,乘法逆元 坑点 : 区间要做到不重不漏, long long 侃侃 : 这道题在比赛是写的尺取,但是写了半天发现不好处理除 0 问题(浮点错误),需要用到乘法逆 ...