P10780 BZOJ3028 食物 题解
题目链接:P10780 BZOJ3028 食物
题意:
cxy 这次又要出去旅游了,和上次不同的是,她这次要去宇宙探险!我们暂且不讨论她有多么 NC,她又幻想了她应该带一些什么东西。理所当然的,你当然要帮她计算携带 $n$ 件物品的方案数。
她这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等。
当然,她又有一些稀奇古怪的限制:
每种食物的限制如下:
- 承德汉堡:偶数个;
- 可乐:$0$ 个或 $1$ 个;
- 鸡腿:$0$ 个,$1$ 个或 $2$ 个;
- 蜜桃多:奇数个;
- 鸡块:$4$ 的倍数个;
- 包子:$0$ 个,$1$ 个,$2$ 个或 $3$ 个;
- 土豆片炒肉:不超过一个;
- 面包:$3$ 的倍数个;
注意,这里我们懒得考虑 cxy 对于带的食物该怎么搭配着吃,也认为每种食物都是以「个」为单位(反正是幻想嘛),只要总数加起来是 $n$ 就算一种方案。因此,对于给出的 $n$,你需要计算出方案数,并对 $10007$ 取模。
输入格式:
一个整数 $n$,表示总数。
输出格式:
一个整数,表示方案数模 $10007$。
数据范围:
对于所有数据,$1\leq n\leq 10^{500}$;
考虑生成函数:
汉堡偶数个,那么
可乐 0/1 个,那么
鸡腿 0/1/2 个,那么
蜜桃多奇数个,那么
鸡块 $4^k$ 个,那么
包子 0/1/2/3 个,那么
土豆片炒肉 0/1 个,那么
面包 $3^k$ 个,那么
把上面这些 $f$ 全部乘起来,得到
那么第 $n-1$ 项的系数为
时间复杂度 $\mathcal{O}(\log_{10}n)$
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x, int y) { x < y ? x = y : 0; }
void down(int &x, int y) { x > y ? x = y : 0; }
#define rep(i, a, b) for(int i = (a), i##END = (b); i <= i##END; i++)
#define Rep(i, a, b) for(int i = (a), i##END = (b); i >= i##END; i--)
#define N ((int)())
const int mod = 10007;
#define gc() getchar()
template<typename T> void read(T &k)
{
k = 0; char ch = gc();
while(isdigit(ch)) { k = (k * 10 + ch - '0') % mod; ch = gc(); }
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
// freopen("check.in","r",stdin);
// freopen("check.out","w",stdout);
int n; read(n);
printf("%lld\n", n * (n + 1) % mod * (n + 2) % mod * 1668 % mod);
return 0;
}
参考文献:
[1] https://www.cnblogs.com/zhangtianli/p/bzoj3028.html
题外话:
放图片。