【BZOJ 3028】 食物

3028: 食物

Time Limit: 3 Sec Memory Limit: 128 MB

Submit: 296 Solved: 185

[Submit][Status][Discuss]

Description

明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!

我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西。理所当然的,你当然要帮他计算携带N件物品的方案数。

他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等

当然,他又有一些稀奇古怪的限制:

每种食物的限制如下:

承德汉堡:偶数个

可乐:0个或1个

鸡腿:0个,1个或2个

蜜桃多:奇数个

鸡块:4的倍数个

包子:0个,1个,2个或3个

土豆片炒肉:不超过一个。

面包:3的倍数个

注意,这里我们懒得考虑明明对于带的食物该怎么搭配着吃,也认为每种食物都是以‘个’为单位(反正是幻想嘛),只要总数加起来是N就算一种方案。因此,对于给出的N,你需要计算出方案数,并对10007取模。

Input

输入样例1

1

输出样例1

1

输入样例2

5

输出样例2

35

数据范围

对于40%的数据,1<=N<=100000;

对于所有数据,1<=n<=10^500;

生成函数(母函数)。

生成函数介绍by matrix67

首先列出每种食物的生成函数:

全部乘起来,就是总的生成函数(根据生成函数的定义就可以理解为什么要乘起来),我们对这个函数泰勒展开,然后化简就是答案(n+23)

说一下(1?x)?k是怎么变的:

根据(1+x)k=C0kx0+C1kx1+...Ckkxk,可以推得

(1?x)?k=C0?k(?x)0+C1?k(?x)1+...Ck?k(?x)k+...

(k为负数和小数是加到正无穷)

接下来的转化就是上图中“根据”的内容了(第二行最后没照全。。是xn)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#define mod 10007
using namespace std;
char s[505];
int Pow(int x,int n)
{
    int ans=1,b=x;
    while (n)
    {
        if (n&1) ans=ans*b%mod;
        b=b*b%mod;
        n>>=1;
    }
    return ans;
}
int main()
{
    scanf("%s",s);
    int n=0;
    for (int i=0;i<strlen(s);i++)
        n=n*10%mod+s[i]-‘0‘;
    cout<<n*(n+1)%mod*(n+2)%mod*Pow(6,mod-2)%mod<<endl;
    return 0;
}

时间: 2024-11-06 01:49:55

【BZOJ 3028】 食物的相关文章

bzoj 3028: 食物 -- 母函数

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

BZOJ 3028: 食物 [生成函数 隔板法 | 广义二项式定理]

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

BZOJ 3028 食物 生成函数

Description 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应 该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数.他这次又准备带一些受欢迎的食物, 如:蜜桃多啦,鸡块啦,承德汉堡等等当然,他又有一些稀奇古怪的限制:每种食物的限制如下: 承德汉堡:偶数个 可乐:0个或1个 鸡腿:0个,1个或2个 蜜桃多:奇数个 鸡块:4的倍数个 包子:0个,1个,2个或3个 土豆片炒肉:不超过一个. 面包:3的倍数个 注意,这里我们

[BZOJ 3028]食物(生成函数)

Description 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险! 我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数. 他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等 当然,他又有一些稀奇古怪的限制: 每种食物的限制如下: 承德汉堡:偶数个 可乐:0个或1个 鸡腿:0个,1个或2个 蜜桃多:奇数个 鸡块:4的倍数个 包子:0个,1个,2个或3个 土豆片炒肉:不超过一个. 面包:3的倍数个 注意,这里

bzoj 3028 食物——生成函数

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3028 把式子写出来,化一化,变成 x / ((1-x)^4) ,变成几个 sigma 相乘的样子,用组合意义看一下第 n 项的系数,就是 n-1 的可以不选的划分,即 C( n-1+3,3 ) .为了高精度方便,化成 (n+2)*(n+1)*n/6 . 别忘了取模. 注意读入高精度数字的方法.错了几次之后只会一位一位地读了-- #include<iostream> #include<

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

BZOJ 3028 食物 组合数学

题目大意:简单易懂自己看- - 去学了下母函数相关的东西- - 其实不难理解嘛- - 的说- - #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 510 #define MOD 10007 using namespace std; int n; char s[M]; int main() { int i; scanf("%

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

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

3028: 食物

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