我們先考慮全部緊湊的情況,也就是沒有多餘的空格的情況(將d
id_i
di–,先不考慮魔法師佔的空間)。
這裡用了乙個很巧妙的方法,多加一維,表示預留的空位。
加入a會有三種情況(e表示空位):a,ae或ea,eae。
對於第一種,表示a兩邊都有魔法師。
對於第二種,表示a的一邊有,一邊沒有。
對於第三種,表示a的兩邊都是空的。
如果我們按照從大到小的順序來,就會發現只需要考慮當前情況就可以了。
比如說是eae的情況,我們就可以直接加上a的距離了。
此時可以設f[i
][j]
[k
]f[i][j][k]
f[i][j
][k]
表示前i個魔法師,還有j個空位,用了k距離的方案數。
最後將那些多餘的空格放入,用組合數(隔板法)算一下就可以了。
#include#include#includeusing namespace std;
const int mod=1000000007;
int m,n,ans,sum,fac[1000005],inv[1000005],a[45],f[2][45][10005];
void mo(int &x)
int qsm(int x,int b)
int c(int x,int y)
int main()
} for(int i=0;i<=min(sum<<1,m-n);i++) mo(ans+=1ll*f[n&1][0][i]*c(m-i,n)%mod);
printf("%d\n",ans);
return 0;
}
BZOJ 4498 魔法的碰撞
魔法總是令戰鬥的局面變幻莫測。然而魔力的碰撞則更是天馬行空,甚至會出現無法控制而自取滅亡的情況。因此,魔力碰撞總是沒有辦法的辦法。設想有一條長度為l的戰線,你可以把你的魔法師們安排在戰線上的每個格仔。每乙個魔法師都有乙個攻擊範圍di,排兵時必須保證任意兩個魔法師的攻擊範圍的較大值小於等於它們之間的距...
BZOJ4498 魔法的碰撞(組合數學 dp)
傳送門 首先我們發現乙個排列,2個魔法使之間一定要填max di,di 1 1max d i,d 1 max di di 1 1個格仔而如果總共一定要填的為k kk個,貢獻就是 l kn n l k 考慮dpdp dp出每種情況的方案數 首先按d dd從大到小排序消除max maxma x我們發現乙...
BZOJ4498 魔法的碰撞(動態規劃)
點此看題面 大致題意 你要在 m 個格仔中擺放 n 個魔法師 每個魔法師有乙個攻擊範圍 使他們不能互相攻擊,求方案數。要用魔法戰勝魔法!顯然我不會魔法只會膜法,所以就被這道題吊錘了 這是一道比較有趣的題。題意看起來很簡單,資料範圍好像也很小,於是我就先後飛快地有了兩個想法,然後又先後飛快地hack掉...