题目大意:你需要构造一个长度为$n$的排列$A$,使得里面包含有子序列$B$(子序列$B$为一个给定的$1$到$m$的排列),且对于每个$i$,有$A[A[i]]=i$,问有多少种方案方案。

数据范围:$n≤10^7$,$m≤500$,答案对$10^9+7$取模

我们首先不考虑有m的存在,考虑如何构造一个符合条件的序列$A$。

我们发现我们可以DP,设$f[i]$表示有多少种长度为i的序列满足$A[A[i]]=i$。

对于第$i$个数,我们可以考虑把它填在原位,或者放在第j个位置,然后在$A[i]$处填上$j$。

根据这个,不难推出$f[i]=(i-1)f[i-2]+f[i-1]$。

我们下面考虑,序列$B$的前$k$个数,位于$A$中前$m$个位置,剩余的$m-k$个,位于后$n-m$个位置。

我们发现,对于剩余的$m-k$个数,对应的$A_B[i]$,都会被占用,用来填(填写了$B[i]$的位置)。

所以我们需要在前$m$个位置里,用恰好$k$个位置,按顺序填出序列$B$前$k$个数字。

不难发现,至多只有一种填法。

对于$B[i]$,我们找到序列$A$中第i个可以填数的地方,直接填入$B[i]$即可。

最后$O(m)$扫一遍判断即可。

如果可行,那么剩下的$n-k$个位置中,需要找出$m-k$个位置放置$B[k+1],B[k+2].....B[m]$,并且在$A[B[k+1]]$等地方填上它们的位置。

剩下的$n-2m+k$个位置,就可以随便填>m的数了,方案数显然是$f[n-2m+k]$

所以方案数为$\binom{n-k}{m-k}\times f[n-2m+k]$。

我们对于每个不超过m的k全部处理一遍就可以了。

时间复杂度:$O(n+m^2)$

 #include<bits/stdc++.h>
#define MOD 1000000007
#define L long long
#define M 10000005
using namespace std; L fac[M]={},invfac[M]={},f[M]={};
L pow_mod(L x,L k){L ans=;for(;k;k>>=,x=x*x%MOD) if(k&) ans=ans*x%MOD; return ans;}
L C(int n,int m){return fac[n]*invfac[m]%MOD*invfac[n-m]%MOD;} L mark[M]={},b[M]={},a[M]={},ans=,n,m;
void solve(int k){
if(n-m<m-k) return;
for(int i=,j=;i<=k;i++,j++){
while(!mark[j]) j++;
a[j]=b[i];
}
for(int i=;i<=m;i++)
if(mark[i]&&a[a[i]]!=i) return;
ans=(ans+C(n-m,m-k)*f[n-m-m+k])%MOD;
}
int main(){
fac[]=; for(int i=;i<M;i++) fac[i]=fac[i-]*i%MOD;
invfac[M-]=pow_mod(fac[M-],MOD-);
for(int i=M-;~i;i--) invfac[i]=invfac[i+]*(i+)%MOD;
f[]=f[]=; for(int i=;i<M;i++) f[i]=(f[i-]+f[i-]*(i-))%MOD; scanf("%d%d",&n,&m);
for(int i=;i<=m;i++) scanf("%d",b+i);
for(int k=;k<=m;k++){
mark[b[k]]=;
solve(k);
}
cout<<ans<<endl;
}

【xsy2303】呀 dp的更多相关文章

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

  2. 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...

  3. AEAI DP V3.7.0 发布,开源综合应用开发平台

    1  升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...

  4. AEAI DP V3.6.0 升级说明,开源综合应用开发平台

    AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...

  5. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  6. [斜率优化DP]【学习笔记】【更新中】

    参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...

  7. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  8. px、dp和sp,这些单位有什么区别?

    DP 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以 首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算 ...

  9. android px转换为dip/dp

    /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...

随机推荐

  1. 更改Oracle字符集避免乱码

    如何更改Oracle字符集避免乱码 转一位大神的笔记. 国内最常用的Oracle字符集ZHS16GBK(GBK 16-bit Simplified Chinese)能够支持繁体中文,并且按照2个字符长 ...

  2. 将python、pip 加入环境变量

    加python: CMD里输:    path=%path%;C:\Python27 其中   C:\Python27  为python的exe所在的文件夹 加pip: CMD里输:    path= ...

  3. github 访问速度太慢

    151.101.112.249 http://global-ssl.fastly.Net 192.30.253.112 http://github.com 在hosts文件添加 另 pip里的pyec ...

  4. C# dns.gethostentry()获取失败,提示不存在主机

    传入参数domain有误. 如果是域名,可以解析.如果是局域ip可以解析. 如果是外网,解析不成功. 解决方法: 判断传入参数是域名还是ip,如果是域名,则使用dns.gethostentry(dom ...

  5. easyui combobox下拉框文字超出宽度有横向滚轮

    //下拉框显示横向滚轮 $(".combo").mouseenter(function(){ $(this).prev().combobox("showPanel&quo ...

  6. Zabbix安装部署(CentOS系统下)

    zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统 ...

  7. JavaScript RegExp.$1

    我们不生产代码 我们只是代码的搬运工 JavaScript RegExp.$1 RegExp 是javascript中的一个内置对象.为正则表达式. RegExp.$1是RegExp的一个属性,指的是 ...

  8. 服务器重新启动,ftp重新连接问题

    服务器重新启动,发现FlashFXP无法连接了,估计是ftp没有启动, 1. 首先服务器要安装ftp软件,查看是否已经安装ftp软件下:   #which vsftpd   如果看到有vsftpd的目 ...

  9. 《笨方法学Python》加分题6

    types_of_people = 10 x = f"There are {types_of_people} types of peoples." binary = "b ...

  10. c++模板笔记

    使用vc2015进行C++ 模板的学习实验和笔记 用简单示例学习了解STL template大部头理论书 讲解各种规则和各种规则例外的解决办法 集中精力在20%的规则中的阴暗角落而不是80%实践中要注 ...