题目链接
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;
}
标签:frac,int,res,times,子函数,食物,3132,define
From: https://www.cnblogs.com/zyyun/p/16793887.html