一邊探索,一邊破壞離散成一些開區間;/*如果計數題數大區間少可以考慮這個思路,用組合數計數處理區間*/——《巨齒鯊》
用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...