【BZOJ4517】排列計數(SDOI2016)-組合數學:錯排
測試地址:排列計數
做法:本題需要用到組合數學中的錯排問題。
首先,如果兩個序列中穩定的位置不同,那麼兩個序列肯定不同,因此我們列舉穩定的位置,有種方案,然後對於剩下的元素,它們不能處在編號和它相同的位置上,學過組合數學的同學應該知道這就是經典的錯排問題,令長為的排列中,對所有都有的排列數為個,我們有遞推式:
邊界條件為。那麼本題的答案就是。
如果只是擺遞推式就太沒意思了,就來講講這個遞推式是怎麼來的吧。
我們列舉所在的位置,顯然它不可能在號位置,那麼其它任意位置它都可以選,共種選擇。然後對於它選擇的位置,我們討論在不在位置上:
如果在位置上,那麼其它個元素都不能在自己的位置上,方案數為。
如果不在位置上,那麼它不能在位置,而其它個元素都不能在自己的位置上,方案數為。
這就是上述遞推式的由來。於是我們就解決了這一題。
以下是本人程式碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
int T,n[500010],m[500010],maxn=0;
ll fac[1000010],inv[1000010],fi[1000010],D[1000010];
ll C(int n,int m)
{
return fac[n]*fi[m]%mod*fi[n-m]%mod;
}
int main()
{
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
scanf("%d%d",&n[i],&m[i]);
maxn=max(maxn,n[i]);
}
fac[0 ]=fac[1]=inv[0]=inv[1]=fi[0]=fi[1]=1;
D[0]=1,D[1]=0;
for(ll i=2;i<=(ll)maxn;i++)
{
fac[i]=fac[i-1]*i%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
fi[i]=fi[i-1]*inv[i]%mod;
D[i]=(i-1)*(D[i-1]+D[i-2])%mod;
}
for(int i=1;i<=T;i++)
printf("%lld\n",C(n[i],m[i])*D[n[i]-m[i]]%mod);
return 0;
}
相關推薦
【BZOJ4517】排列計數(SDOI2016)-組合數學:錯排
測試地址:排列計數 做法:本題需要用到組合數學中的錯排問題。 首先,如果兩個序列中穩定的位置不同,那麼兩個序列肯定不同,因此我們列舉穩定的位置,有CmnCnm種方案,然後對於剩下的元素,它們不能處在
【OpenCV】影象變換(二)邊緣檢測:梯度運算元、Sobel運算元和Laplace運算元
邊緣 邊緣(edge)是指影象區域性強度變化最顯著的部分。主要存在於目標與目標、目標與背景、區域與區域(包括不同色彩)之間,是影象分割、紋理特徵和形狀特徵等影象分析的重要基礎。 影象強度的顯著變化可分為: •階躍變化函式,即影象強度在不連續處的兩邊的畫
2018.09.18【BZOJ4517】【SDOI2016】排列計數(組合數學)(錯排問題)
Description 求有多少種長度為 n 的序列 A,滿足以下條件: 1 ~ n 這 n 個數在序列中各出現了一次 若第 i 個數 A[i] 的值為 i,則稱 i 是穩定的。序列恰好有 m 個數是穩定的 滿足條件的序列可能很多,序列數對 10^9+7 取模。
【原創】演算法分享(4)Cardinality Estimate 基數計數概率演算法
讀過《程式設計珠璣》(<Programming Pearls>)的人應該還對開篇的Case記憶猶新,大概的場景是: 作者的一位在電話公司工作的朋友想要統計一段時間內不同的電話號碼的個數,電話號碼的數量很大,當時的記憶體很小,所以不能把所有的電話號碼全部放到記憶體來去重統計,他的朋友很苦惱。 作
【ZJOJ2010】數字計數(數字計數)
設f[i][j][p]表示長度為i 最高位為j p出現的個數 顯然 f[i][j][p]=sigma{f[i-1][k][p]} 其中k是次高位 但是最高位出現的那麼多次都沒有被我們算進去 但是很顯然只需要加上(i-2)^10就闊以了 然後常規的分[1,b],[1,a-1]解決 常規的分成兩部分 一部分最高位
【模板】負環(spfa)
sizeof 貪心 com image 一行 clas 存在 cst -m 洛谷——P3385 【模板】負環 題目描述 暴力枚舉/SPFA/Bellman-ford/奇怪的貪心/超神搜索 輸入輸出格式 輸入格式: 第一行一個正整數T表
【模板】矩陣加速(數列)
cst opera name 結果 ++ 取余 int 數列 names 題目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a數列的第n項對1000000007(10^9+7)取余的值。 輸入輸出格式 輸入格式: 第一行一
【轉】SVM入門(六)線性分類器的求解——問題的轉化,直觀角度
content cli 樣本 image ges 五個 是你 角度 spa SVM入門(六)線性分類器的求解——問題的轉化,直觀角度 讓我再一次比較完整的重復一下我們要解決的問題:我們有屬於兩個類別的樣本點(並不限定這些點在二維空間中)若幹,如圖, 圓形的樣本點定為正樣
【leetcode】Word Break(python)
條件 text for -m 是我 tex eas sso false 思路是這種。我們從第一個字符開始向後依次找,直到找到一個斷句的地方,使得當前獲得的子串在dict中,若找到最後都沒找到。那麽就是False了。 在找到第一個後,接下來找下一個斷句處,當然是從第
【轉】JMeter學習(四)參數化
一個 ngx adr conf 英文逗號 .net 註意 itl ron JMeter也有像LR中的參數化,本篇就來介紹下JMeter的參數化如何去實現。 參數化:錄制腳本中有登錄操作,需要輸入用戶名和密碼,假如系統不允許相同的用戶名和密碼同時登錄,或者想更好的模擬多個
【轉】JMeter學習(三)元件的作用域與執行順序
ces ner 處理器 規則 fig 子節點 控制器 conf 節點 1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與線程組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生交互作用的元件,邏輯控制器只對其子節點的取樣器有效,而其它元件(config
【轉】JMeter學習(二)錄制腳本
使用 get 運行 喜歡 錄制完成 帶來 免費 sdn title ---------------------------------------------------------------------------------------------------- 環境
P1939 【模板】矩陣加速(數列)
include algo pid str ostream 格式 矩陣加速 continue pri 鏈接: P1939 【模板】矩陣加速(數列) 題目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a數列的第n項對
【Fortinet】飛塔(FortiGate)防火墻低端產品命令行下配置RIP
rip fortinet forgate 飛塔防火墻 命令行配置rip 前言:FortiGate中端、高端產品支持web頁面配置RIP/OSPF/BGP,低端(桌面級)產品不支持,只支持CLI配置------雖然官網有手冊(英文版),但沒有實際案例,並給出建立連接的結果來的舒服~~這就是此
【貪心】紀念品分組(P1094)
scanf name print 所有 namespace 整數 數據 %d 輸出格式 題目描述 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多只能包括兩件紀念品,
【4】 簡單繪圖(二)
dispose alt draw bsp rom 形狀 .html yellow tex 在上一篇裏已經向大家介紹了如何使用GDI+繪制簡單的圖像,這一篇繼續向大家介紹其它一些繪圖知識. 1.首先我們來看下上一篇中我們使用過的Pen. Pen的屬性主要有: Color(顏色
luogu_1939 【模板】矩陣加速(數列)
iostream urn 加速 spa con () truct highlight ems #include <cstdio> #include <iostream> #include <cstring> using namespac
【轉】VBA 入門 (一)
文件的 方法 記錄 glob 數字 數據 list 目錄 處理 VBA語言的基礎認識 由 vietdung90 創建,最後一次修改 2016-10-18 【轉自W3CSCHOOL】 第一節:標識符 一、定義 標識符是一種標識變量、常量、過程、函數、類等語言構
【CODEFORCES】 891B Gluttony(構造)
ray markdown tinc lower blog clu include first right codeforces 891B Gluttony 鏈接:http://codeforces.com/problemset/problem/891/B Descripti
【UVA】201 Squares(模擬)
ref size || for != %d else eof mark 題目 題目 ? ? 分析 記錄一下再預處理一下。 ? ? 代碼 #include <bits/stdc++.h> int main() { int t=0,s,n; wh