bzoj1630/2023 [Usaco2007 Demo]Ant Counting
阿新 • • 發佈:2017-06-03
gist count std sig cnblogs stat 螞蟻 php ant
傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=1630
http://www.lydsy.com/JudgeOnline/problem.php?id=2023
【題解】
直接dp,f[i,j]表示第i個種族選了j只螞蟻的方案數,轉移枚舉這個種族選擇的方案。
然後可以前綴和+滾動數組
# include <stdio.h> # include <string.h> # include <iostream> # include <algorithm> // # include <bits/stdc++.h>View Codeusing namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int M = 5e5 + 10; const int mod = 1e6; # define RG register # define ST static int m, n, A, B; int a[M], bel[M], sum[M]; int f[2][100010], s[2][100010]; int main() { cin >> m >> n >> A >> B;for (int i=1; i<=n; ++i) { scanf("%d", &bel[i]); a[bel[i]] ++; } int pre = 0, cur = 1; f[pre][0] = 1; for (int i=0; i<=n; ++i) s[pre][i] = 1; for (int i=1; i<=m; ++i) { for (int j=0; j<=n; ++j) { if(a[i] < j) f[cur][j] = (s[pre][j] - s[pre][j-a[i]-1] + mod) % mod; else f[cur][j] = s[pre][j]; if(j == 0) s[cur][j] = f[cur][j]; else s[cur][j] = (s[cur][j-1] + f[cur][j]) % mod; } swap(pre, cur); } int ans = (s[pre][B] - s[pre][A-1] + mod) % mod; cout << ans << endl; return 0; }
bzoj1630/2023 [Usaco2007 Demo]Ant Counting