APIO2016 組合計數dp 划艇

2021-08-24 23:14:45 字數 965 閱讀 1653

一邊探索,一邊破壞

——《巨齒鯊》

離散成一些開區間;/*如果計數題數大區間少可以考慮這個思路,用組合數計數處理區間*/

用f[i][j][k]表示最後乙個取到i這個學校,取值在第j段的,j段裡已經取了k個的方案數;

轉移,考慮前乙個取到的學校;

f[i][j][k]=f[i−1][j][k]+f[i−1][j][k−1]∗(len[j]−k+1)/k

f[i][j][1]=f[i−1][j][1]+∑∑f[i−1][j′][k]∗len[j]

其中len[j]表示第j段包含整點個數。 

用字首和優化第二個轉移    

#include#define rep(i, x, y) for(int i = (x); i <= (y); i++)

#define per(i, x, y) for(int i = (x); i >= (y); i--)

#define n 505

#define ll long long

#define mod 1000000007

using namespace std;

int n, tot, a[n], b[n], num[n<<1], g[n], c[n], inv[n];

int main()

sort(num+1, num+1+tot); tot = unique(num+1, num+1+tot)-num-1;

rep(i, 1, n)

c[0] = 1; g[0] = 1;

rep(j, 1, tot-1) g[i] = (g[i]+f)%mod;}}

int ans = 0; rep(i, 1, n) ans = (ans+g[i])%mod;

printf("%d\n", ans);

return 0;

}

POJ 3761 (組合計數)

氣泡排序一輪 相鄰之間的兩個數比較,然後交換。現在給你乙個有序的數列,從 1 n 而且是經過 k 輪交換得來的。問你有多少個這樣的數列。對於乙個數列,我們是有乙個反序表的 ai,反序表中的 ai 表示 i 左邊有多少比 i 要大的數的個數。可以很容易得到反序表 和 原序列是一一對應的。而經過氣泡排序...

2019暑期金華集訓 Day1 組合計數

n le 10 直接暴力列舉。n le 32 meet in the middle,如果左邊選了 x 右邊選了 y 且 x y le b 那麼對答案的貢獻就是 根據範德蒙德恒等式 sum n 所以上面可以拆開成 sum 列舉 x 關於 y 是乙個字首和。如果沒有下界的限制,只有 p i in 0,r...

清華集訓2016 組合數問題 數字dp

題意 給定 n,m,k 求 sum 1 n sum 1 k c i,j 分析 根據 text 定理,c i,j c i mod k,j mod k c frac,frac 只要出現乙個 i mod k j mod k 或 frac,frac 就會出現 模擬一下這個遞迴過程,就會發現每次出現的 i m...