1. 程式人生 > >[SDOI2016] 排列計數

[SDOI2016] 排列計數

題目傳送門

很明顯,這是一個需要用到組合數來求解的題,並且還要知道 錯位排列是什麼 

首先很容易得出一個式子C(n,m)*(....),括號內暫時不管,就是先假設符合條件的m個數字的擺放的位置,接下來處理剩餘的n-m個數字,簡記為K。

對於剩下的K個數字,因為它們的排列一定不滿足A[i]=i,所以就可以用到錯位排列的知識。

記D[i]為有i個數的錯位排列的個數,那麼由乘法原理可得答案為C(n,m)*D(K)。

接下來

1.組合數的求法,用階乘+逆元預處理求組合數,先預處理出資料範圍內的階乘,根據費馬小定理

(a MOD p意義下的逆元等於a^(p-2)%p),求出fact(i)的逆元inv[i]。最後O(1)回答。

2.對於錯排列的求法,有這麼一個遞推公式D[i]=(i-1)*(D[i-1]+D[i-2])

至此問題基本得到解決。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#define MOD 1000000007
#define MAXN 1000007
#define N 1000000
#define LL long long
using namespace std;

LL n,m;
LL fact[MAXN],inv[MAXN];
LL f[MAXN],tmp;

//快速冪,求逆元
inline LL Q_pow(LL x,LL y){
	LL res=1;
	while(y){
		if(y&1) res=(res*x)%MOD;
		x=(x*x)%MOD;
		y>>=1;
	}
	return res;
}

//預處理,求階乘及其逆元
inline void init(){
	f[0]=1;f[1]=0;f[2]=1;     //初始化,為了處理掉一些特殊情況
	fact[0]=1;inv[0]=1;       //
	for(LL i=1;i<=N;++i){
		fact[i]=fact[i-1]*i%MOD;
		inv[i]=Q_pow(fact[i],MOD-2);
	}
	for(LL i=3;i<=N;++i){
		f[i]=((i-1)*(f[i-1]+f[i-2]))%MOD;
	}
}

inline void solve(){
	LL T;
	scanf("%lld",&T);
	while(T--){
		scanf("%lld %lld",&n,&m);
		tmp=((fact[n]*inv[m]%MOD)*inv[n-m])%MOD;
		tmp=(tmp*f[n-m])%MOD;
		printf("%lld\n",tmp);
	}
}

int main(){
	init();
	solve();
	return 0;
}

相關推薦

Bzoj4517 [Sdoi2016]排列計數

合數 sans continue cor cst con ace mes white Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1207 Solved: 733 Description 求有多少種長度為 n 的

bzoj 4517: [Sdoi2016]排列計數【容斥原理+組合數學】

沒有 原理 getchar() display del d+ getchar esp const 第一個一眼就A的容斥題! 這個顯然是容斥的經典問題------錯排,首先考慮沒有固定的情況,設\( D_n \)為\( n \)個數字的錯排方案數。 \[ D_n=n!-\su

4517: [Sdoi2016]排列計數

urn body while clu main mar 取模 pan n-2 Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有 m 個

[SDOI2016]排列計數

name math 排列 gpo str rip amp lld can Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有

bzoj4517: [Sdoi2016]排列計數

continue ont math inline ans tin n) turn long long 題目鏈接 bzoj4517: [Sdoi2016]排列計數 題解 組合數問題: \(ans = C(n,m) * D(n-m)\) , \(D(x)\)表示元素為x個的序列

[SDOI2016] 排列計數 (組合數學)

... sin name splay 兩個 solution .cn define getchar() [SDOI2016]排列計數 題目描述 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為

BZOJ 4517--[Sdoi2016]排列計數

ans ref algorithm 解決 ble con 接下來 stream href 4517: [Sdoi2016]排列計數 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1727 Solved: 1067

組合數學+錯排問題【p4071】[SDOI2016]排列計數

列數 out input while tro 理解 mod void script Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有

bzoj4517[Sdoi2016]排列計數(組合數,錯排)

4517: [Sdoi2016]排列計數 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1792  Solved: 1111[Submit][Status][Discus

BZOJ4517:[SDOI2016]排列計數(組合數學,錯排公式)

++i color name 組合數 int sdoi for tput urn Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列

BZOJ4517P4071 [SDOI2016]排列計數

錯排+組合數 不難發現把穩定的m個數除掉後,就是一個錯排問題,錯排的遞推式是D[i]=(i-1)*(d[i-1]+d[i-2])具體證明自己去翻一翻別的部落格,我後續也會寫 但是這m個位置是不固定的,所

【[SDOI2016]排列計數

一眼題,答案就是\(C_m^m*d_{n-m}\) 就是從\(n\)箇中選取\(m\)個在位,剩下的錯排,之後就是乘法原理了 但是我發現我的錯排公式竟然一直不會推 這個遞推式很簡單,就是\(d[1]=0,d[2]=1,d[n]=(n-1)*(d[n-2]+d[n-1)\) 其實是這樣推出來的 我們從

[SDOI2016] 排列計數

題目傳送門 很明顯,這是一個需要用到組合數來求解的題,並且還要知道 錯位排列是什麼  首先很容易得出一個式子C(n,m)*(....),括號內暫時不管,就是先假設符合條件的m個數字的擺放的位置,接下來處理剩餘的n-m個數字,簡記為K。 對於剩下的K個數字,因為它們的排列

【組合+錯排】BZOJ4517(Sdoi2016)[排列計數]題解

題目概述 如果 ai=i 則 i 是穩定的。給出 n,m ,求穩定數為 m 的 n 的排列的個數。 解題報告 其實很簡單……先選出 m 個穩定位置,然後另外 n−m 強制不穩定。 強制不穩定

BZOJ4517 Sdoi2016 排列計數 【DP+組合計數】*

BZOJ4517 Sdoi2016 排列計數 Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為

省選專練SDOI2016排列計數

引證:錯排遞推式:f(n)=(f(n-1)+f(n-2))*(n-1)試證:f表示當前n個的錯排。當前選擇n時,第一,對於位置k,互換則權值加上f(n-2)個錯排,否則加上f(n-1)個錯排。#incl

LG4071 [SDOI2016]排列計數

const ati 個數 pan span 出現 Coding hidden sample 題意 題目描述 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有

排列計數[SDOI2016]

n-2 階乘 perm 不能 表示 can gcd urn 但是 題目描述 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序

【BZOJ4517】排列計數SDOI2016)-組合數學:錯排

測試地址:排列計數 做法:本題需要用到組合數學中的錯排問題。 首先,如果兩個序列中穩定的位置不同,那麼兩個序列肯定不同,因此我們列舉穩定的位置,有CmnCnm種方案,然後對於剩下的元素,它們不能處在

2018.09.18【BZOJ4517】【SDOI2016排列計數(組合數學)(錯排問題)

Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 10^9+7 取模。