AcWing 230. 排列计数 水题(组合数+错排)打卡

题目:https://www.acwing.com/problem/content/232/

#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
const int maxn = 1000005;
ll dp[maxn],inv[maxn],fac[maxn],inv_fac[maxn];
void init()
{
    inv[0]=inv[1]=inv_fac[0]=fac[0]=1;
    dp[1]=0;dp[2]=1;
    for(int i=2; i<maxn; i++) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
    for(int i=1; i<maxn; i++) fac[i]=fac[i-1]*i%mod;
    for(int i=1; i<maxn; i++) inv_fac[i]=inv_fac[i-1]*inv[i]%mod;
    for(int i=3; i<maxn; i++) dp[i]=(i-1)*(dp[i-2]+dp[i-1])%mod;
}
ll C(int n,int m)
{
    return fac[n]*inv_fac[m]%mod*inv_fac[n-m]%mod;
}
int main()
{
    init();
    ll n,m,t;
    scanf("%lld",&t);
    while(t--){
        scanf("%lld%lld",&n,&m);
        if(n==m) printf("1\n");
        else printf("%lld\n",(C(n,m)*dp[n-m])%mod);
    }
}

原文地址:https://www.cnblogs.com/Lis-/p/11295988.html

时间: 2024-10-10 13:34:48

AcWing 230. 排列计数 水题(组合数+错排)打卡的相关文章

hdu 1465(不容易系列之一)(水题,错排公式)(a[n]=(n-1)*(a[n-1]+a[n-2]))

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14924    Accepted Submission(s): 6207 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总

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

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

【BZOJ4517】[Sdoi2016]排列计数 组合数+错排

[BZOJ4517][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 行,每行一个

HDU1465 第六周L题(错排组合数)

L - 计数,排列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!  做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样.  话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的.比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然

poj 1164 The Castle dp区域计数水题

水题,直接贴代码. //poj 1164 //sep9 #include <iostream> using namespace std; int a[64][64]; int dp[64][64]; int n,m; const int west=1,north=2,east=4,south=8; void dfs(int x,int y) { dp[x][y]=1; if((a[x][y]&north)==0&&dp[x-1][y]==-1){ dfs(x-1,y);

K - Wand(组合数+错排公式)

N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, numbered from 1 to n(Wand_i owned by wizard_i). After the meeting, n wizards will take a wand one by one in the order of 1 to n. A boring wizard deci

BZOJ 4517 组合数+错排

思路: 预处理错排 然后C(n,m)*s[n-m-1]就是答案了 特判n-m-1<0 //By SiriusRen #include <cstdio> using namespace std; #define int long long const int mod=1000000007,N=1000050; int cases,n,m,fac[N],s[N]; int pow(int x,int y){ int res=1; while(y){ if(y&1)res=res*x%

Uva11538 排列组合水题

画个图就很容易推出公式: 设mn=min(m,n),mx=max(m,n) 对角线上: 横向:m*C(n,2) 纵向:n*C(m,2) 因为所有的C函数都是只拿了两个,所以可以优化下.不过不优化也过了= = 1 #include <iostream> 2 using namespace std; 3 #define LL long long 4 int n,m; 5 6 LL P(long n,long m) 7 { 8 long p=1; 9 while(m!=0) 10 { 11 p*=n

[hdu5203]计数水题

思路:把一个木棍分成3段,使之能够构成三角形的方案总数可以这样计算,枚举一条边,然后可以推公式算出当前方案数.对于已知一条边的情况,也用公式推出.用max和min并维护下,以减少情况数目. 1 #pragma comment(linker, "/STACK:10240000,10240000") 2 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 #include