排列计数(permutation)
排列计数(permutation)
题目描述
求有多少种长度为n的序列A,满足以下条件:
1) 1~n这n个数在序列中各出现了一次
2) 若第i个数A[i]的值为i,则称i是稳定的。序列恰好有m个数是稳定的。
满足条件的序列可能很多,序列数对109+7取模。
输入
第一行一个数T,表示有T组数据。
接下来T行,每行两个整数n、m。
输出
输出T行,每行一个数,表示求出的序列数。
样例输入
5
1 0
1 1
5 2
100 50
10000 5000
样例输出
0
1
20
578028887
60695423
提示
【数据规模与约定】
T=500000,n≤1000000,m≤1000000。
来源
solution
此题求C(n,m)*f[n-m](f[i]表示i个数错排的方案)
我只会容斥求错排https://blog.csdn.net/liankewei123456/article/details/81563581
这题会T
公式:
啥意思
考虑新加入第i个数,如果与k互换 那么方案为f[i-2]
如果不是则为f[i-1]
这样的k有(i-1)个
注意 f[0]=1,f[1]=0,f[2]=1;
剩下的就是基础啦
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000005
#define mod 1000000007
using namespace std;
long long T,n,m,h[maxn],ny[maxn];
long long f[maxn];
long long lian(long long k,int num){
long long a=k,ans=1;
while(num>0){
if(num&1)ans=ans*a;
a=a*a;a%=mod;ans%=mod;num>>=1;
}
return ans;
}
long long C(int n,int m){
return (((h[n]*ny[m])%mod)*ny[n-m])%mod;
}
int main(){
h[0]=1;
n=1000000;
for(int i=1;i<=n;i++){h[i]=h[i-1]*i;h[i]%=mod;}
ny[n]=lian(h[n],mod-2);ny[0]=1;
for(int i=n-1;i>=1;i--){
ny[i]=ny[i+1]*(i+1);
ny[i]%=mod;
}
int op=1;
f[0]=1;f[1]=0;f[2]=1;
for(int i=3;i<=1000000;i++){
f[i]=((i-1)*((f[i-1]+f[i-2])%mod))%mod;
//if(i<=50)cout<<f[i]<<endl;
}
cin>>T;
while(T--){
scanf("%lld%lld",&n,&m);
long long tmp=C(n,m)*f[n-m];
tmp%=mod;
printf("%lld\n",tmp);
}
return 0;
}
排列计数(permutation)的更多相关文章
- ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)
这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...
- 数学(错排):BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 693 Solved: 434[Submit][Status ...
- BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]
4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...
- [BZOJ4517][SDOI2016]排列计数(错位排列)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1616 Solved: 985[Submit][Statu ...
- BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 911 Solved: 566[Submit][Status ...
- bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)
题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 846 Solved: 530[Submit][ ...
- 【数论·错位排列】bzoj4517 排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1428 Solved: 872[Submit][Statu ...
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- bzoj4517排列计数 错排+组合
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1491 Solved: 903[Submit][Statu ...
随机推荐
- vue列表过渡效果
<transition-group></transition-group> ① 列表 <transition-group> </transition-grou ...
- Oracle Analyze
Analyze使用场景 之前很多次都说到,对表的索引等信息进行了增删改之后,需要对表进行analyze更新统计信息,才能使数据库做出最好的执行计划,没有注意到,即使是一张很小的空表,如果进行了字段的增 ...
- nodejs 用户登录密码md5加密
jade文件 div.login ul.inp-content li span= '用户名:' input.ui-input1#input1(placeholder='请输入手机号') li sp ...
- 1037: [ZJOI2008]生日聚会Party
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3121 Solved: 1858[Submit][Status][Discuss] Descript ...
- 二十一、MySQL NULL 值处理
MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. ...
- DevOps - 版本控制 - Gogs
Gogs Gogs官网:https://gogs.io Gogs文档:https://gogs.io/docs Gogs配置文件手册:https://gogs.io/docs/advanced/con ...
- oracle 11gR2 for win7旗舰版64安装以及连接plsql和NaviCat(win64_11gR2_database) (2012-12-31-bd 写的日志迁移
先到oracle官网http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html下载必要数 ...
- 关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)
一.需求 现有一个字符串str String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\&quo ...
- Network of Schools POJ - 1236 (强联通)
一些学校连接到了一个计算机网络.网络中的学校间有如下约定:每个学校维护一个列表,当该学校收到软件或信息后将会转发给列表中的所有学校(也就是接收方列表).需要注意的是如果B学校在A学校的接收方列表中,A ...
- C# datagridview列绑定类中类的属性
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://www.cnblogs.com/linghaoxinpian/p/5906374. ...