【XSY2668】排列统计 DP
题目描述
给你一个长度为\(n\)的排列\(a\),每次要选择两个数,交换这两个数(这两个数可以相同)。总共要交换\(k\)次。
最后要统计数列中有多少位置\(i\)满足\(\max_{j\leq i}a_i=a_i\)。求前面这个东西的期望。
\(n\leq 100,k\leq 80\)
题解
我们枚举每个数\(y\)每在个位置\(x\)的贡献。把其他数中大于\(y\)的看成\(1\),把其他数中小于\(y\)的看成\(0\),然后DP。
设\(f_{i,j,k}\)为交换了\(i\)次,\(1\)~\(x-1\)有\(j\)个\(1\),(\(k\)在下面解释)的方案数
两条竖线中间是位置\(x\)
\(k=0\):\(|y|\)
\(k=1\):\(y|0|\)
\(k=2\):\(y|1|\)
\(k=3\):\(|0|y\)
\(k=4\):\(|1|y\)
转移很多很繁琐,大家自己去推吧。。。
时间复杂度:总共有\(O(n^2)\)次DP,每次\(O(nk)\),总的时间复杂度是\(O(n^3k)\)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void open(const char *s)
{
#ifndef ONLINE_JUDGE
char str[100];
sprintf(str,"%s.in",s);
freopen(str,"r",stdin);
sprintf(str,"%s.out",s);
freopen(str,"w",stdout);
#endif
}
const ll p=1000000007;
ll fp(ll a,ll b)
{
ll s=1;
for(;b;b>>=1,a=a*a%p)
if(b&1)
s=s*a%p;
return s;
}
int x,y,i,j,k;
int n,m;
int a[100010];
ll f[90][110][5];
void add(ll &a,ll b)
{
a=(a+b)%p;
}
ll qian0(){return (k==1||k==2)?x-2-j:x-1-j;}
ll qian1(){return j;}
ll hou0(){return (k==2?y+j-x+1:(k==3?y+j-x-1:y+j-x));}
ll hou1(){return (k==2||k==4)?n-y-j-1:n-y-j;}
ll qian0(int k){return (k==1||k==2)?x-2-j:x-1-j;}
ll qian1(int k){return j;}
ll hou0(int k){return (k==2?y+j-x+1:(k==3?y+j-x-1:y+j-x));}
ll hou1(int k){return (k==2||k==4)?n-y-j-1:n-y-j;}
int now(){return (k==1||k==3)?0:((k==2||k==4)?1:-1);}
int where(){return (k==1||k==2)?0:1;}
ll sqr(ll x){return x*x%p;}
ll gao()
{
memset(f,0,sizeof f);
int h=0,hh;
for(i=1;i<x;i++)
if(a[i]>y)
h++;
for(i=1;i<=n;i++)
if(a[i]==y)
{
hh=i;
break;
}
if(hh==x)
f[0][h][0]=1;
else if(hh<x)
if(a[x]<y)
f[0][h][1]=1;
else
f[0][h][2]=1;
else
if(a[x]<y)
f[0][h][3]=1;
else
f[0][h][4]=1;
for(i=0;i<m;i++)
for(j=0;j<y;j++)
{
for(k=0;k<=4;k++)
if(f[i][j][k])
{
add(f[i+1][j][k],f[i][j][k]*sqr(qian0()+qian1()));
add(f[i+1][j][k],f[i][j][k]*sqr(hou0()+hou1()));
add(f[i+1][j][k],f[i][j][k]*2*qian0()%p*hou0());
add(f[i+1][j][k],f[i][j][k]*2*qian1()%p*hou1());
add(f[i+1][j][k],f[i][j][k]);
if(j)
add(f[i+1][j-1][k],f[i][j][k]*2*qian1()%p*hou0());
if(j<y-1)
add(f[i+1][j+1][k],f[i][j][k]*2*qian0()%p*hou1());
if(k)
add(f[i+1][j][k],f[i][j][k]);
}
if(f[i][j][0])
{
add(f[i+1][j][1],f[i][j][0]*2*qian0(0));
if(j)
add(f[i+1][j-1][2],f[i][j][0]*2%p*qian1(0));
add(f[i+1][j][3],f[i][j][0]*2*hou0(0));
add(f[i+1][j][4],f[i][j][0]*2*hou1(0));
}
if(f[i][j][1])
{
add(f[i+1][j][0],f[i][j][1]*2);
add(f[i+1][j][1],f[i][j][1]*2*(qian0(1)+qian1(1)));
add(f[i+1][j][3],f[i][j][1]*2*hou0(1));
if(j<y-1)
add(f[i+1][j+1][3],f[i][j][1]*2%p*hou1(1));
add(f[i+1][j][1],f[i][j][1]*2*(qian0(1)+hou0(1)));
add(f[i+1][j][2],f[i][j][1]*2*hou1(1));
if(j)
add(f[i+1][j-1][2],f[i][j][1]*2%p*qian1(1));
}
if(f[i][j][2])
{
if(j<y-1)
add(f[i+1][j+1][0],f[i][j][2]*2);
add(f[i+1][j][2],f[i][j][2]*2*(qian0(2)+qian1(2)));
add(f[i+1][j][4],f[i][j][2]*2*hou0(2));
if(j<y-1)
add(f[i+1][j+1][4],f[i][j][2]*2%p*hou1(2));
add(f[i+1][j][1],f[i][j][2]*2*hou0(2));
if(j<y-1)
add(f[i+1][j+1][1],f[i][j][2]*2%p*qian0(2));
add(f[i+1][j][2],f[i][j][2]*2*(qian1(2)+hou1(2)));
}
if(f[i][j][3])
{
add(f[i+1][j][0],f[i][j][3]*2);
add(f[i+1][j][3],f[i][j][3]*2*(hou0(3)+hou1(3)));
add(f[i+1][j][1],f[i][j][3]*2*qian0(3));
if(j)
add(f[i+1][j-1][1],f[i][j][3]*2*qian1(3));
add(f[i+1][j][3],f[i][j][3]*2*(qian0(3)+hou0(3)));
add(f[i+1][j][4],f[i][j][3]*2*hou1(3));
if(j)
add(f[i+1][j-1][4],f[i][j][3]*2*qian1(3));
}
if(f[i][j][4])
{
add(f[i+1][j][0],f[i][j][4]*2);
add(f[i+1][j][4],f[i][j][4]*2*(hou0(4)+hou1(4)));
add(f[i+1][j][2],f[i][j][4]*2*qian0(4));
if(j)
add(f[i+1][j-1][2],f[i][j][4]*2*qian1(4));
add(f[i+1][j][3],f[i][j][4]*2*hou0(4));
if(j<y-1)
add(f[i+1][j+1][3],f[i][j][4]*2*qian0(4));
add(f[i+1][j][4],f[i][j][4]*2*(qian1(4)+hou1(4)));
}
}
return f[m][0][0];
}
int main()
{
open("pltj");
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
ll ans=0;
for(x=1;x<=n;x++)
for(y=1;y<=n;y++)
if(y>=x)
ans=(ans+gao())%p;
ans=ans*fp(fp(n,2*m),p-2)%p;
printf("%lld\n",ans);
return 0;
}
【XSY2668】排列统计 DP的更多相关文章
- 动态规划——区间DP,计数类DP,数位统计DP
本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- LA 3641 Leonardo的笔记本 & UVA 11077 排列统计
LA 3641 Leonardo的笔记本 题目 给出26个大写字母的置换B,问是否存在要给置换A,使得 \(A^2 = B\) 分析 将A分解为几个循环,可以观察经过乘积运算得到\(A^2\)后,循环 ...
- BZOJ 1072: [SCOI2007]排列perm [DP 状压 排列组合]
题意:给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0) 100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15 看到整 ...
- [BZOJ3992][SDOI2015]序列统计(DP+原根+NTT)
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1888 Solved: 898[Submit][Statu ...
- 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理
题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Mogic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Mogic的,答案可能很 ...
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
3193: [JLOI2013]地形生成 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 459 Solved: 223[Submit][Status ...
- P7444-「EZEC-7」猜排列【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P7444 题目大意 一个长度为\(n\)的排列,已知每个\(c_i\)表示那个排列中\(mex\)为\(i\)的区间 ...
- 【XSY2666】排列问题 DP 容斥原理 分治FFT
题目大意 有\(n\)种颜色的球,第\(i\)种有\(a_i\)个.设\(m=\sum a_i\).你要把这\(m\)个小球排成一排.有\(q\)个询问,每次给你一个\(x\),问你有多少种方案使得相 ...
随机推荐
- websockect外网无法访问问题
项目在测试环境可以正常使用websockect,然而把项目发布到公网上却无法使用问题. 有几种解决方案,1.防火墙未加入入站规则,否则没有权限连接到外网. 方法:控制面板--window防火墙---高 ...
- Palindromic characteristics CodeForces - 835D (区间DP,预处理回文串问题)
Palindromic characteristics of string s with length |s| is a sequence of |s|integers, where k-th num ...
- sql 查询优化小计
好久没更博了,偷偷的抽时间写一下. 早上开始working的时候,发现一个页面加载很慢,经排查是昨天写的一条联合查询的sql导致的.于是着手优化! 首先想到的是在join的时候,减少表体积之后再进行关 ...
- java中的代码块是什么意思,怎么用
代码块是一种常见的代码形式.他用大括号“{}”将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块.代码块的格式如下: 方法/步骤 普通代码块:是最常见的代码块,在方法里用一对“{ ...
- Shell脚本1
1Shell编程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell脚本 Shell 脚本(shell scr ...
- MySQL 使用左连接替换not in
众所周知,左连接和右连接的含义是以哪一张表为准. 左连接就是以左表为准,查出的结果中包含左表所有的记录,如果右表中没有与其对应的记录,那么那一行记录中B表部分的内容就全是NULL. 现在有两个表,一个 ...
- 【kindle笔记】之 《恶意》-2018-4-20
[kindle笔记]读书记录-总 在答辩和考试和各种大作业的重压以及两天后全校停电的巨大挤压中,一口气读完了恶意这本书. 这本书是我读的东野圭吾的第二本书.第一本是心心念念的<解忧杂货店> ...
- Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval o
pom.xml报错: Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from https://repo.maven.apach ...
- laravel log改为时间格式
1 providers新建文件 LogRotateServiceProvider.php <?php namespace App\Providers; use Monolog\Formatter ...
- POJ1108_Split Windows 解题报告
Split Windows 题目链接:http://poj.org/problem?id=1108 题目大意: 给你一棵二叉树的先序遍历,有三种字符:|.-.A~Z,然后用窗口表示出来,|: 表示将当 ...