bzoj3028 食物(生成函式 Lucas)

2021-08-13 20:24:03 字數 1512 閱讀 1848

明明這次又要出去旅遊了,和上次不同的是,他這次要去宇宙探險!我們暫且不討論他有多麼nc,他又幻想了他應該帶一些什麼東西。理所當然的,你當然要幫他計算攜帶n件物品的方案數。他這次又準備帶一些受歡迎的食物,如:蜜桃多啦,雞塊啦,承德漢堡等等當然,他又有一些稀奇古怪的限制:每種食物的限制如下:

承德漢堡:偶數個

可樂:0個或1個

雞腿:0個,1個或2個

蜜桃多:奇數個

雞塊:4的倍數個

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

土豆片炒肉:不超過乙個。

麵包:3的倍數個

注意,這裡我們懶得考慮明明對於帶的食物該怎麼搭配著吃,也認為每種食物都是以『個』為單位(反正是幻想嘛),只要總數加起來是n就算一種方案。因此,對於給出的n,你需要計算出方案數,並對10007取模。

輸入乙個數字n,1<=n<=10^500

如題 輸入樣例1

1輸入樣例2

5輸出樣例1

1輸出樣例235

[ submit][

status][

discuss]

分析:

這道題只要是看過生成函式內容的同學

一定一眼就可以看出這是生成函式的題:

我們可以得到以下的式子:

我們看一下每個式子是怎麼化簡的:

都乘起來:

我們之所以化出這個式子,是因為有這樣乙個關係:

設e1,e2,e3,…,e8為各種食物的數量,則答案就是一下方程的解:

e1+e2+e3+….+e8=n

我們化出這個式子後,就有:

x^e1*x^e2*x^e3*….*x^e8=x^n

因此x^n的係數就是n的答案

所以這道題的答案就是:

花了好長時間化出了式子,我一看n的資料範圍

我的ma呀,這是要高精度的節奏啊

但是模數格外的小

所以可以用lucas定理來完成

c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p

(c(n%p, m%p)*lucas(n/p, m/p))%p

//這裡寫**片

#include

#include

#include

#define ll long long

using namespace std;

const int p=10007; //質數

int inv[p+10],jc[p+10],n;

char s[510];

int c(int n,int

m)int main()

BZOJ 3028 食物 生成函式

明明這次又要出去旅遊了,和上次不同的是,他這次要去宇宙探險!我們暫且不討論他有多麼nc,他又幻想了他應該帶一些什麼東西。理所當然的,你當然要幫他計算攜帶n件物品的方案數。他這次又準備帶一些受歡迎的食物,如 蜜桃多啦,雞塊啦,承德漢堡等等當然,他又有一些稀奇古怪的限制 每種食物的限制如下 承德漢堡 偶...

BZOJ3028 食物(生成函式)

乙個人要帶 n 個物品,共有 8 種物品,每種的限制分別如下 偶數個 0 1個 0 1 2個 奇數個 4的倍數個 0 1 2 3個 0 1個 3的倍數個。求方案數。n 10 對於八個物品的限制,分別構造生成函式,然後乘起來就是我們要的解。化簡後得到 f x frac x 1 x x2 4 現在考慮求...

BZOJ3028 食物(生成函式)

顯然構造出生成函式 則有f x 1 x2 x4 1 x 1 x x2 x x3 x5 1 x4 x8 1 x x2 x3 1 x 1 x3 x6 化為有限,則有f x x 1 x 2 1 x x2 1 x x2 x3 1 x2 2 1 x3 1 x4 x 1 x x2 1 x 1 x 2 1 x3 ...