生活随笔
收集整理的這篇文章主要介紹了
POJ 3046 Ant Counting
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
題意
一共有T種螞蟻編號從1 到 T,給出A個螞蟻序列,問任取n個螞蟻一共可以組幾種集合,求S到B的種類和
AC
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <map>
#include <bitset>
#include <string.h>
#include <cmath>
#include <algorithm>
#define N 100015
#define P pair<int,int>
#define ll long long
#define mk(a, b) make_pair(a, b)
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
int dp[N];
int inf =
0x3f3f3f3f;
int mod =
1e6;
int main(){
#ifndef ONLINE_JUDGEfreopen(
"in.txt",
"r", stdin);
#endifint t, a, s, b;
scanf(
"%d%d%d%d", &t, &a, &s, &b);
vector<int> v(t +
1);
for (
int i =
0; i < a; ++i) {
int x;
scanf(
"%d", &x);v[x]++;}
vector <int> sum(t +
1);
for (
int i =
1; i <= t; ++i) {sum[i] = sum[i -
1] + v[i];}mem(dp,
0);
for (
int i =
0; i <= v[
1]; ++i) {dp[i] =
1;}
for (
int k =
2; k <= t; ++k) {
for (
int i = b; i >=
1; --i) {
if (i > sum[k])
continue;ll tot =
0;
for (
int j =
0; j <= v[k]; ++j) {
if (i - j <
0)
break;tot += dp[i - j];tot %= mod;}dp[i] = tot;}}ll ans =
0;
for(
int i = s; i <= b; ++i) {ans += dp[i];ans %= mod;}
printf(
"%lld\n", ans);
return 0;
}
總結
以上是生活随笔為你收集整理的POJ 3046 Ant Counting的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。