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