poj 3046 Ant Counting 多项式乘法解可重组合数

题意:

裸的求可重组合数。

分析:

多项式乘法求系数的应用啊,不用dp。

代码:

//poj 3046
//sep9
#include <iostream>
using namespace std;
const int maxN=1024;
const int maxL=100024;
const int mod=1000000;

int num[maxN];
int coef[maxL];
int tmp[maxL];
int l1;

void mul(int l2)
{
	for(int i=0;i<=l1+l2;++i)
		tmp[i]=0;
	for(int i=0;i<=l1;++i)
		for(int j=0;j<=l2;++j)
			tmp[i+j]=(tmp[i+j]+coef[i])%mod;
	l1+=l2;
	for(int i=0;i<=l1;++i)
		coef[i]=tmp[i];
}

int main()
{
	int t,a,s,b;
	memset(num,0,sizeof(num));
	scanf("%d%d%d%d",&t,&a,&s,&b);
	while(a--){
		int x;
		scanf("%d",&x);
		++num[x];
	}
	memset(coef,0,sizeof(coef));
	coef[0]=1;
	l1=0;
	for(int i=1;i<=t;++i)
		mul(num[i]);
	int ans=0;
	for(int i=s;i<=b;++i)
		ans=(ans+coef[i])%mod;
	printf("%d\n",ans);
	return 0;
} 
时间: 2024-11-19 11:26:32

poj 3046 Ant Counting 多项式乘法解可重组合数的相关文章

POJ 3046 Ant Counting(“动态规划” 优化递推关系式)

http://poj.org/problem?id=3046 蚂蚁牙黑,蚂蚁牙红:有A只蚂蚁,来自T个家族.同一个家族的蚂蚁长得一样,但是不同家族的蚂蚁牙齿颜色不同.任取n只蚂蚁(S<=n<=B),求能组成几种集合? 这是<2.3 记录结果再利用的"动态规划" 优化递推关系式>练习题的第二题. 定义 dp[i][j] := 使用前i个家族可以配出来"元素个数为j"的集合的个数. 那么dp[0][0] = 1,不使用任何蚂蚁配出空集的个数为1.

poj 3046 Ant Counting

题目大意: 有编号一到t的蚂蚁家族,每个家族有不同的蚂蚁数. 问构成S只蚂蚁到构成B只蚂蚁共有多少种方式 例如 While observing one group, the set of three ant families was seen as {1, 1, 2, 2, 3}, though rarely in that order. The possible sets of marching ants were: 3 sets with 1 ant: {1} {2} {3} 5 sets

POJ 3046 Ant Counting ( 多重集组合数 &amp;&amp; 经典DP )

题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  实际就是要解决 => 从 n 种物品中取出 m 个有多少种取法 ( 同种无法区分 ) 计数问题的 DP 定义必须保证不重复计数 这里定义 dp[i+1][j] => 从前 i 种物品中取出 j 个的组合数 根据定义为了从前 i 种物品中取出 j 个,可以从前 i-1 中取出 j-k 个并从 i

poj 3046 Ant Counting DP

大致题意:给你a个数字,这些数字范围是1到t,每种数字最多100个,求问你这些a个数字进行组合(不包含重复),长度为s到b的集合一共有多少个. 思路:d[i][j]——前i种数字组成长度为j的集合有多少个. 那么,当前考虑第i种数字,我要组成长度为j的集合,只用在前i-1种数字所组成的集合中,只要添加0...cnt[i]个第i种数字之后长度能够达到j的那些集合数加起来 所以方程可以写成d[i][j] = ∑(cnt[i],0)  d[i-1][j-k]. 每种数字最多100个,数字最大为1000

Ant Counting (poj 3046 分组背包)

Language: Default Ant Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3142   Accepted: 1246 Description Bessie was poking around the ant hill one day watching the ants march to and fro while gathering food. She realized that man

洛谷.3803.[模板]多项式乘法(FFT)

题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. #include <cmath> #include <cctype> #include <cstdio> #include <algorithm> #define gc() getchar() const int N=1e6+5; const double PI=acos(-1); int n,m; struct Complex { double

[FFT]luogu 3803 【模板】多项式乘法

题目背景 这是一道FFT模板题 注意:虽然本题开到3s,但是建议程序在1s内可以跑完,本题需要一定程度的常数优化. 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: 第一行2个正整数n,m. 接下来一行n+1个数字,从低到高表示F(x)的系数. 接下来一行m+1个数字,从低到高表示G(x))的系数. 输出格式: 一行n+m+1个数字,从低到高表示F(x)?G(x)的系数. 输入输出样例 输入样例 1 2 1 2 1 2

POJ 2386 Lake Counting 搜索题解

简单的深度搜索就可以了,看见有人说什么使用并查集,那简直是大算法小用了. 因为可以深搜而不用回溯,故此效率就是O(N*M)了. 技巧就是增加一个标志P,每次搜索到池塘,即有W字母,那么就认为搜索到一个池塘了,P值为真. 搜索过的池塘不要重复搜索,故此,每次走过的池塘都改成其他字母,如'@',或者'#',随便一个都可以. 然后8个方向搜索. #include <stdio.h> #include <vector> #include <string.h> #include

[UOJ 0034] 多项式乘法

#34. 多项式乘法 统计 描述 提交 自定义测试 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,分别表示第一个多项式的 00 到 nn 次项前的系数. 第三行 m+1m+1 个整数,分别表示第一个多项式的 00 到 mm 次项前的系数. 输出格式 一行 n+m+1n+m+1 个整数,分别表示乘起来后的多项式的 00 到 n+mn+m 次项前的系数. 样例一 input 1 2 1