排列计数(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。

来源

SDOI2016 Round1 Day2


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)的更多相关文章

  1. ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)

    这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...

  2. 数学(错排):BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status ...

  3. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

  4. [BZOJ4517][SDOI2016]排列计数(错位排列)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1616  Solved: 985[Submit][Statu ...

  5. BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 911  Solved: 566[Submit][Status ...

  6. bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)

    题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 846  Solved: 530[Submit][ ...

  7. 【数论·错位排列】bzoj4517 排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1428  Solved: 872[Submit][Statu ...

  8. BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]

    2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1936  Solved: 477[Submit][ ...

  9. bzoj4517排列计数 错排+组合

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1491  Solved: 903[Submit][Statu ...

随机推荐

  1. 使用vue-cli创建项目

    使用Vue UI创建.管理项目 1.全局安装vue-cli 3.0 npm install -g @vue/cli 2.启动vue ui 创建项目: vue ui

  2. java调用摄像头了

    http://www.cnblogs.com/cnweiblog/p/4602207.html

  3. java算法面试题:金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

    package com.swift; public class RenMingBi { private static final char[] data = new char[]{'零','壹','贰 ...

  4. 洛谷 P1346 电车

    这道题的关键在建图 把每一个车站看成一个点,将这个车站相连的第一个车站建立一条边权为0的边,对于它所相连的其他车站,建立边权为1的边: 这样我们可以得到一张图: 起点,终点都知道了,跑一边最短路即可 ...

  5. 自动化运维工具——ansible系列命令

    ansible-galaxy 连接 https://galaxy.ansible.com 下载相应的roles,此网站是Ansible爱好者将日常使用较好的playbooks打包上传,其他人可以免费下 ...

  6. Redux百行代码千行文档

    接触Redux不过短短半年,从开始看官方文档的一头雾水,到渐渐已经理解了Redux到底是在做什么,但是绝大数场景下Redux都是配合React一同使用的,因而会引入了React-Redux库,但是正是 ...

  7. 使用VUE开发

    <一>VUE的开发分两种,一种是直接在HTML文件中使用,一种是VUE文件的形式开发 1,首先我们先让 HTML 文件支持 VUE 的语法指令提示 2,File -> Setting ...

  8. Tesseract-ocr视觉学习-验证码识别及python import pytesseract使用

    Tesseract-OCR的简单使用与训练 最近看到某个网站提交数据要提交验证码,用tesseract自带的识别, 识别出来是什么鬼,0-9识别成了什么玩意! so决定自己训练下tesseract.. ...

  9. 常州大学新生寒假训练会试 I 合成反应

    题目描述 有机合成是指从较简单的化合物或单质经化学反应合成有机物的过程. 有时也包括从复杂原料降解为较简单化合物的过程. 由于有机化合物的各种特点,尤其是碳与碳之间以共价键相连,有机合成比较困难,常常 ...

  10. shell脚本入门基础知识

    shell 脚本的第一行 #!/bin/bash #!/bin/sh 其实,sh是bash的一个软链接 sh -> bash 变量,字母下划线开头(好像是没有类型的) #普通变量 var1=ni ...