description
對於給定的乙個長度為n的序列,問有多少個序列對於所有的i滿足:a[1]~a[i]這i個數字中有恰好b[i]個數字小等於i。其中為1~n的乙個排列,即1~n這n個數字在序列a[i]中恰好出現一次。
資料保證了至少有乙個排列滿足b序列。
input
輸入的第1行為乙個正整數n,表示了序列的長度。
第2行包含n個非負整數,描述了序列。
output
輸出僅包括乙個非負整數,即滿足的序列個數。
sample input3
0 1 3
sample output3
【樣例說明】
對於a序列為1~3的全排列分別對應的b序列如下(冒號左邊為a序列,冒號右邊為對應b的序列)
1 2 3:1 2 3
1 3 2:1 1 3
2 1 3:0 2 3
2 3 1:0 1 3
3 1 2:0 1 3
3 2 1:0 1 3
所以有3個滿足的a序列。
【資料說明】
對於20%的資料,有n≤8;
對於30%的資料,有n≤11且答案不大於20000;
對於50%的資料,有n≤100;
對於100%的資料,有n≤2000。
solution :考試的時候沒有什麼想法,就按照組合數常見的思路想,但是最後還是暴力了。在網上看見有十分巧妙的建模,設想有乙個01矩陣,對於乙個元素a[i][j],i表示這是第i個數,而這個數是什麼,就看j,倘若a[i][j]的值是1,則表示第i個位置的數為j。這樣建模的話對於每乙個b[i],就相當於以[i][i]為右下角的矩陣中,有b[i]個1,否則就是不合法的排列。同時相鄰的b[i],不可能差值超過2,那麼分類討論之後就會有乙個累加的式子,當差為1時ans *= 2
*i-1- 2
*b[i-
1],差為2時ans *= sqr(i-
1- b[i-1])
ps.高精度(答案不會超過n!)。
#include#define ya 10
#define maxn 6000
using namespace std;
int b[maxn],n,push,x,ans[maxn];
void init()
void mul(int x)
while (push)
}void work()
if (b[i] - b[i-1] == 2) }}
void print()
int main()
09 排序1 排序
09 排序1 排序 25 分 給定n 個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 include include includeusing namespace std const int cutoff 1000...
09 排序1 排序
n個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。資料2 11個不相同的整數,測試基本正確性 資料3 10 3個隨機整數 資料4 10 4個隨機整數 資料5 10 5個隨機整數 資料6 10 5個順序整數 資料7 10 5個逆序整數 資料8 10 5個基本有序的整數 資料9 10 5個隨機正...
09 排序1 排序
本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 資料1 只有1個元素 資料2 11個不相同的整數,測試基本正確性 資料3 103個隨機整數 資料4 104個隨機整數 資料5 105個隨機整數 資料6 105個順序整數 資料7 105個逆序整數 資料8 105個基本有序的...