3132. 食物

题目链接

3132. 食物

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

我们暂且不讨论他有多么睿智,他又幻想了他应该带一些什么东西。

理所当然的,你当然要帮他计算携带 \(N\) 件物品的方案数。

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

当然,他又有一些稀奇古怪的限制,每种食物的限制如下:

  • 承德汉堡:偶数个。
  • 可乐:\(0\) 个或 \(1\) 个。
  • 鸡腿:\(0\) 个,\(1\) 个或 \(2\) 个。
  • 蜜桃多:奇数个。
  • 鸡块:\(4\) 的倍数个。
  • 包子:\(0\) 个,\(1\) 个,\(2\) 个或 \(3\) 个。
  • 土豆片炒肉:不超过一个。
  • 面包:\(3\) 的倍数个。

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

因此,对于给出的 \(N\),你需要计算出方案数,并对 \(10007\) 取模。

输入格式

一个整数 \(N\)

输出格式

一个整数,表示方案数对 \(10007\) 取模后的结果。

数据范围

\(1 \le N \le 10^{500}\)

输入样例1:

1

输出样例1:

1

输入样例2:

5

输出样例2:

35

解题思路

生成函数

生成函数是一些子函数的乘积,其中各子函数之间没有关系,主要用来解决求解各子函数组合的方案数问题

例如本问题中以子函数承德汉堡为例:其函数可表示为 \(f1(x)=1+x^2+x^4+\dots =\frac{1}{1-x^2}\),中 \(x^i\) 的系数表示用承德汉堡做 \(i\) 个的方案数,同理,其他子函数如下:

\[f2(x)=1+x=\frac{1-x^2}{1-x}\\\ f3(x)=1+x+x^2=\frac{1-x^3}{1-x}\\\ f4(x)=x+x^3+x^5\dots =\frac{x}{1-x^2}\\\ f5(x)=1+x^4+x^8+\dots =\frac{1}{1-x^4}\\\ f6(x)=1+x+x^2+x^3=\frac{1-x^4}{1-x}\\\ f7(x)=1+x=\frac{1-x^2}{1-x}\\\ f8(x)=1+x^3+x^6+\dots =\frac{1}{1-x^3} \]

其生成函数为 \(f(x)=f1(x)\times f2(x)\times f3(x)\times f4(x)\times f5(x)\times f6(x)\times f7(x)\times f8(x)=\frac{1}{1-x^2}\times \frac{1-x^2}{1-x} \times \frac{1-x^3}{1-x}\times \frac{x}{1-x^2}\times \frac{1}{1-x^4}\times \frac{1-x^4}{1-x}\times \frac{1-x^2}{1-x}\times \frac{1}{1-x^3}=\frac{x}{(1-x)^4}=x\times (\sum_{n=0}C_{n+4-1}^{4-1}\times x^n)=\sum_{n=0}C_{n+3}^{3}\times x^{n+1}\)

故答案即为 \(C_{n+2}^3=\frac{(n+2)\times (n+1)\times n}{6}\)

  • 时间复杂度:\(O(1)\)

代码

// Problem: 食物
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/description/3135/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// %%%Skyqwq
#include <bits/stdc++.h>
 
//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
 
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
 
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
 
template <typename T> void inline read(T &x) {
    int f = 1; x = 0; char s = getchar();
    while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
    while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
    x *= f;
}

const int N=505,mod=10007;
int res;
char s[N];
int main()
{
    scanf("%s",s);
    for(int i=0;s[i];i++)
    	res=(res*10+s[i]-'0')%mod;
    printf("%d",(LL)(res+2)*(res+1)*res/6%mod);
    return 0;
}
posted @ 2022-10-15 12:08  zyy2001  阅读(10)  评论(0编辑  收藏  举报