一句話題意
給定1到n求其全排列中沒有三個及以上遞增(減)的方案數,ans%p(p不一定為素數)
錯誤打法一
我看到這道題後首先想到的是容斥:
ans=全排列-至少3個不滿足的+至少4個......
但是考慮不到有兩個不連續的遞增(減)的情況,所以wa0了。
錯誤打法二
f[i][0]代表前i個已經處理好了且下乙個該是山谷的方案,1同理。
假如有乙個這樣的數列(i=8)
3 2 7 4 5 6 1
j
4 5 6不滿足條件,所以要把8往4 5之間放,所以便有
f[i][(i-j-1)&1]+=f[j][1]*f[i-j-1][(i-j-1)&1];
但是我們會發現我們不能考慮到i放的地方前乙個和後乙個的大小所以這個又崩了......
正解
其實不用考慮往中間插,只要考慮往末尾放就行,即:
f[i][k&1]+=f[j][1]*f[k][k&1];(k=i-j-1)
呃...樣例又沒過。哦哦,忘記考慮i-1個元素的排列了。
最終式子:
f[i][k&1]+=c[i-1][j]*f[j][1]*f[k][k&1];(k=i-j-1)
因為p不保證是質數,所以組合用楊輝三角遞推即可。
#include#includeview code#define ll long long
using
namespace
std;
ll ans,n,p,f[
5000][2],a[5000][5000
];int
main()}f[
0][0]=f[0][1]=f[1][1]=f[1][0]=1
;
for(int i=2;i<=n;i++)
}ans=(f[n][1]+f[n][0])%p;
printf(
"%lld
",ans);
return0;
}
SDOI2010 地精部落
求1 n的全排列數目,使得對於 i geq 3 a a 的大小關係與 a a 的大小關係不同 題目還有另外一種格式 求一種全排列,使得這個排列要麼滿足奇數項的高度比相鄰位置都大,要麼滿足偶數項的高度比相鄰位置都大.設 dp 表示用了前 i 個數字,a 1 j 且 a 1 a 2 時的方案數 有乙個神...
SDOI2010 地精部落
這道題是一道 dp 題,思維難度比較大。題意 先定義波形陣列 滿足當 i 全為奇數或偶數時,a i a i 1 且 a i a i 1 求 n 的全排列中有多少個符合波形陣列。我們記錄狀態為 f i j 0 1 i 為剩下 i 個數,j 表示有 j 1 個數小於剛剛選擇的數,當第 3 個下標為 0 ...
SDOI2010 地精部落
sdoi2010 地精部落 僅含一行,兩個正整數 n,p。僅含一行,乙個非負整數,表示你所求的答案對p取餘 之後的結果。4 7對於 20 的資料,滿足 n 10 對於 40 的資料,滿足 n 18 對於 70 的資料,滿足 n 550 對於 100 的資料,滿足 3 n 4200,p 109 我覺得...