JZOJ7月15日提高組T4 排列統計

2021-10-08 03:44:07 字數 1497 閱讀 5128

題解對於給定的乙個長度為n的序列,問有多少個序列對於所有的i滿足:a[1]~a[i]這i個數字中有恰好b[i]個數字小等於i。其中為1~n的乙個排列,即1~n這n個數字在序列a[i]中恰好出現一次。

資料保證了至少有乙個排列滿足b序列。

輸入的第1行為乙個正整數n,表示了序列的長度。

第2行包含n個非負整數,描述了序列。

輸出僅包括乙個非負整數,即滿足的序列個數。

30 1 3

對於20%的資料,有n≤8;

對於30%的資料,有n≤11且答案不大於20000;

對於50%的資料,有n≤100;

對於100%的資料,有n≤2000。

對於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序列。

借助矩陣來分析

上面這張代表的是序列2,3,1

那麼b [i

]b[i]

b[i]

就代表這(1,

1)(1,1)

(1,1)到(i,

i)(i,i)

(i,i

)內1的數量

顯而易見發現b[i

]b[i]

b[i]

和b [i

+1]b[i+1]

b[i+1]

之間的差只有0、1、2三種情況

設f [i

]f[i]

f[i]

表示到第i

ii位置時,只考慮選前i

ii個數的方案數

分類討論

要使用高精度(duliu)

#include

#include

using

namespace std;

int n,i,a[

2005];

long

long c[

10005

],ans[

10005];

void

gjd(

long

long s)

}int

main()

for(i=ans[0]

;i>=

1;i--

)printf

("%d"

,ans[i]);

printf

("\n");

return0;

}

JZOJ7月16日提高組T1 質數

題解定義質數為因數只含1和其本身的數,對於n組詢問,試判斷每個數是否為素數。第一行乙個正整數n,表示有n組詢問。接下來n行,每行乙個正整數m,表示詢問m是否為質數。輸出n行,每行乙個字串。若是質數則輸出 prime 若不是質數則輸出 not prime 52 1089807289 903248294...

JZOJ7月23日提高組T1 同餘

題解有一同餘方程 滿足p pp是質數,xi,jx xi,j 在0 p pp之間 問滿足同餘方程的方案數模乙個給出的數後的結果 手模資料或者打表可以發現,當c 0 c 0c 0時,所有答案都是一樣的 那麼就可以分成c 0 c 0c 0和c 0c 0 c 0兩種情況討論 轉移一下就好了 include ...

JZOJ7月25日提高組T1 挑竹籤

挑竹籤 小時候的遊戲 夏夜,早苗和諏訪子在月光下玩起了挑竹籤這一經典的遊戲。挑竹籤,就是在桌上擺上一把竹籤,每次從最上層挑走一根竹籤。如果動了其他的竹籤,就要換對手來挑。在所有的竹籤都被挑走之後,誰挑走的竹籤總數多,誰就勝了。身為神明的諏訪子自然會讓早苗先手。為了獲勝,早苗現在的問題是,在諏訪子出手...