[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 取模。