[hdu1085]生成函数

题意:给a个1、b个2、c个5,求不能构成最小的数

思路: 先求1能构成的所有数,2能构成的所有数,5能构成的所有数,它们的方法数显然都是1,现在考虑把3者结合在一起,由于结果为和的形式,而又是循环加的,所以考虑用多项式来表示状态,然后进行两次卷积运算就行了。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

#include <iostream>

#include <cstdio>

#include <cmath>

#include <cstdlib>

#include <cstring>

#include <vector>

#include <ctime>

#include <deque>

#include <queue>

#include <algorithm>

#include <map>

#include <cmath>

using namespace std;

#define X                   first

#define Y                   second

#define pb                  push_back

#define mp                  make_pair

#define all(a)              (a).begin(), (a).end()

#define fillchar(a, x)      memset(a, x, sizeof(a))

typedef pair<intint> pii;

typedef long long ll;

typedef unsigned long long ull;

#ifndef ONLINE_JUDGE

void RI(vector<int>&a,int n){a.resize(n);for(int i=0;i<n;i++)scanf("%d",&a[i]);}

void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>

void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?1:-1;

while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>

void print(const T t){cout<<t<<endl;}template<typename F,typename...R>

void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>

void print(T*p, T*q){int d=p<q?1:-1;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}

#endif

template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}

template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}

template<typename T>

void V2A(T a[],const vector<T>&b){for(int i=0;i<b.size();i++)a[i]=b[i];}

template<typename T>

void A2V(vector<T>&a,const T b[]){for(int i=0;i<a.size();i++)a[i]=b[i];}

const double PI = acos(-1.0);

const int INF = 1e9 + 7;

/* -------------------------------------------------------------------------------- */

int a[12345], b[12345];

int main() {

#ifndef ONLINE_JUDGE

    freopen("in.txt""r", stdin);

    //freopen("out.txt", "w", stdout);

#endif // ONLINE_JUDGE

    int n1, n2, n3;

    while (cin >> n1 >> n2 >> n3, n1 + n2 + n3 > 0) {

        fillchar(a, 0);

        fillchar(b, 0);

        for (int i = 0; i <= n1; i ++) {

            for (int j = 0; j <= 2 * n2; j += 2) {

                a[i + j] ++;

            }

        }

        int sz = n1 + 2 * n2;

        for (int i = 0; i <= sz; i ++) {

            for (int j = 0; j <= 5 * n3; j += 5) {

                b[i + j] += a[i];

            }

        }

        for (int i = 0; ; i ++) {

            if (!b[i]) {

                cout << i << endl;

                break;

            }

        }

    }

    return 0;

}

时间: 2024-11-13 22:48:46

[hdu1085]生成函数的相关文章

【BZOJ 3028】 3028: 食物 (生成函数)

3028: 食物 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 569  Solved: 382 Description 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险! 我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数. 他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等 当然,他又有一些稀奇古怪的限制: 每种食物的限制如下: 承德汉堡:偶数个 可乐:0个或1

BZOJ 3028 食物 ——生成函数

把所有东西的生成函数搞出来. 发现结果是x*(1-x)^(-4) 然后把(1-x)^(-4)求逆,得到(1+x+x^2+...)^4 然后考虑次数为n的项前的系数,就相当于选任意四个非负整数构成n的方案数. 大概就是C(n+3,3) 前面还有一项是x,所以n--即可. 然后就A掉了. #include <cstdio> #include <cstring> #define ll long long const int inv=1668; const int md=10007; in

生成函数

普通生成函数 cin>>n for(int i=0;i<=n;i++) { a[i]=1; b[i]=0; } for(int i=2;i<=n;i++) { for(int j=0;j<=n;j++) { for(int k=0;k+j<=n;k+=i) { b[k+j]+=a[j]; } } for(int z=0;z<=n;z++) { a[z] = b[z]; b[z] = 0; } } cout<<a[n]<<endl;

【小结】SG生成函数(Grundy函数)

SG生成函数(Grundy函数)小结 转移到子游戏x&y,则 sg[now]=sg[x]∧sg[y] 模板 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX = 100007; const int MAX_S = 128; const int MAX_X = MAX; int sg[MAX], stone[MAX_S]; int

具体数学二项式至生成函数章-----致敬Kunth

关于标题取得这么奇怪.因为在具体数学中.这两章是分开叙述的.并且分别叙述得淋漓尽致! 我只参悟其中关于生成函数的一小部分内容(暂时于我够用了.) 提二项式系数之前不得不提组合数.以往在高中用的是符号C来表示.但是在具体数学中.将这个符号进行了扩展.甚至出现负数的情况(也就不再有从一些物体中取出一些物体的组合方案数这样的具体意义了,难道你想从负数件物品中取出点什么来吗?) 用 (n,k)代表C(k,n)

HDU 1171 Big Event in HDU --暴力+生成函数

题意:给n种房子,每种房子有一个值val和个数cnt,现在要把这些房子分成两部分,争取两部分总值相等,如果不能相等,让A>B,且A-B最小. 解法:先跑一次生成函数,c[n]表示组成总值为n的方法种数,然后从Total/2~0枚举B的总值,如果c[i]不为0,说明可以达到 i 这个状态,说明这就是B的最接近A的值(因为最接近Total/2).算法复杂度较高.跑了1600多ms,不知道还有没有更优的算法. 代码: #include <iostream> #include <cstdi

[POJ 3734] Blocks 指数型生成函数

题意 有红, 黄, 蓝, 绿四种颜色的砖头. 现在你要将 $n$ 个砖头放成一排. 蓝色, 绿色的砖头的个数必须为偶数. 问最终放置的方案数. n <= 10 ^ 9 . 分析 构建指数型生成函数. $R(x) = Y(x) = \sum_{k = 0} ^ {\infty} \frac{x ^ k}{k !} = e ^ x$ . $B(x) = G(x) = \sum_{k = 0} ^ {\infty} \frac{x ^ {2k}}{(2k)!} = \frac{e ^ x + e ^

BZOJ 3771: Triple [快速傅里叶变换 生成函数 容斥原理]

题意:n个物品,可以用1/2/3个不同的物品组成不同的价值,求每种价值有多少种方案(顺序不同算一种) 挖坑过会再写 生成函数系数为方案数,次数为价值 A(x) 选一个 B(x) A每项平方 选两个 C(x) A每项三次方 选三个 然后容斥原理算答案 注意计算的时候可以一直用点值,最后在变系数表示 #include <iostream> #include <cstdio> #include <string> #include <algorithm> #incl

妙用生成函数

还是从一道题目来开始生成函数的研究吧,下面的题目取自HDU_1028: Problem Description "Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says. "The second problem is, given an positive integer N, we define an equation