【错位+组合】排列计数

题目描述

求有多少种长度为n的序列A,满足以下条件:
1~n这n个数在序列中各出现了一次
若第i个数A[i]的值为i,则称i是稳定的。序列恰好有m个数是稳定的满足条件的序列可能很多,序列数对10^9+7取模。

输入

第一行一个数 T,表示有 T 组数据。
接下来 T 行,每行两个整数 n、m。
T=500000,n≤1000000,m≤1000000

输出

输出T行,每行一个数,表示求出的序列数

样例输入

5
1 0
1 1
5 2
100 50
10000 5000

样例输出

0
1
20
578028887
60695423

有m个位置的数要等于i,其他n-m个位置腰错位,用f[i]=(i+1)*(f[i-1]*f[i-2])推一下,最后c(n,m)*f[n-m]就行了
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll t,n,m;
ll f[5000005],fac[5000005],inv[5000005];

void init()
{
    ll N=2000000;
    f[0]=1,f[1]=0,f[2]=1,fac[0]=1,inv[0]=inv[1]=1;
    for(ll i=3;i<=N;i++) f[i]=(i-1)*((f[i-1]+f[i-2])%mod)%mod;
    for(ll i=1;i<=N;i++) fac[i]=fac[i-1]*i%mod;
    for(ll i=2;i<=N;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    for(ll i=1;i<=N;i++) inv[i]=inv[i]*inv[i-1]%mod;
}

ll c(ll n,ll m)
{
    /*if(!n&&!m)
        return 0;*/
    if(n<m)
        return 0;
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
    init();
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lld %lld",&n,&m);

        printf("%lld\n",c(n,m)*f[n-m]%mod);
    }
    return 0;
}
 

原文地址:https://www.cnblogs.com/Diliiiii/p/9416204.html

时间: 2024-10-09 04:02:42

【错位+组合】排列计数的相关文章

[ZJOI2010]排列计数 (组合计数/dp)

[ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值 输入输出格式 输入格式: 输入文件的第一行包含两个整数 n和p,含义如上所述. 输出格式: 输出文件中仅包含一个整数,表示计算1,2,?, 的排列中, Magic排列的个数模 p的值. 输入输出样例 输入样例#1: 20 23 输出样例#1: 16 说明

bzoj4517排列计数 错排+组合

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1491  Solved: 903[Submit][Status][Discuss] Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input

PHP数组内容不重复组合排列算法

最近在做ecshop的商品库存模块,分别给一款商品的多个属性组合设置库存,如下图: 一款手机有不同颜色,屏幕尺寸,系统和电量,都要设置不同的库存,如果都要手动选择属性组合,则会耗费很多不必要的时间.假如打开页面时就已经设置好属性排列组合那就最好不过,因此想了整天,写了如下函数: 1 <?php 2 3 /* 4 Author:GaZeon 5 Date:2016-6-20 6 Function:getArrSet 7 Param:$arrs 二维数组 8 getArrSet(array(arra

BZOJ 4517: [Sdoi2016]排列计数

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 911  Solved: 566[Submit][Status][Discuss] Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第

[SDOI2016] 排列计数 (组合数学)

[SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7109+7 取模. 输入输出格式 输入格式: 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. 输出格式: 输出 T 行,每行一个数,表示求出的序列数 输入输出样例 输入样例#1: 5 1 0 1 1

BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,表示

BZOJ 2111 Perm 排列计数(满二叉树)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2111 题意:求1到n有多少种排列满足:A[i]>A[i/2](2<=i<=n). 思路:形式类似二叉树.建模之后其实就是n个节点的不同的满二叉树有多少种?用f[i]表示i个节点的满二叉树个数,则f[n]=f[L]*f[R]*C(n-1,L).其中L和R对于确定的n来说是确定的.比如n=10时,左右子树分别有6.3个点. i64 a[N],n,p,f[N]; void init(

ACM/ICPC算法训练 之 数学很重要-浅谈“排列计数” (DP题-POJ1037)

这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列计数 的方法,虽然排列计数的思路简单,但却是算法中一个数学优化的点睛之笔. Poj1037  A decorative fence 题意:有K组数据(1~100),每组数据给出总木棒数N(1~20)和一个排列数C(64位整型范围内),N个木棒长度各异,按照以下条件排列,并将所有可能结果进行字典序排序 1.每一

bzoj2111【ZJOI2010】Perm 排列计数

2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 1548  Solved: 321 [Submit][Status][Discuss] Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能非常大,仅仅能输出模P以后的值 Input 输入文件的第一行

bzoj4517【SDOI2016】排列计数

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 576  Solved: 358 [Submit][Status][Discuss] Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input