P2000 拯救世界
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2000 拯救世界相关的知识,希望对你有一定的参考价值。
题意:
为了拯救世界,小 a 和 uim 决定召唤出 kkksc03 大神和 lzn 大神。根据古籍记载,召唤出任何一位大神,都需要使用金木水火土五种五行神石来摆一个特定的大阵。而在古籍中,记载是这样的:
kkksc03 大神召唤方法:
金神石的块数必须是 6 的倍数。
木神石最多用 9 块。
水神石最多用 5 块。
火神石的块数必须是 4 的倍数。
土神石最多用 7 块。
lzn 大神召唤方法:
金神石的块数必须是 2 的倍数。
木神石最多用 1 块。
水神石的块数必须是 8 的倍数。
火神石的块数必须是 10 的倍数。
土神石最多用 33块。
现在是公元 1999 年 12 月 31 日,小 a 和 uim 从 00:00:00 开始找,一直找到 23:00:00,终于,还是没找到神石。不过,他们在回到家后在自家地窖里发现了一些奇怪的东西,一查古籍,哎呦妈呀,怎么不早点来呢?这里有一些混沌之石,可以通过敲击而衰变成五行神石。于是,他们拼命地敲,终于敲出了n块神石,在 23:59:59 完成了两座大阵。然而,kkksc03 大神和 lzn 大神确实出现了,但是由于能量不够,无法发挥神力。只有把所有用 n 块神石可能摆出的大阵都摆出来,才能给他们充满能量。这下小 a 和 uim 傻了眼了,赶快联系上了你,让你帮忙算一下,一共有多少种大阵。
题解:
很明显,生成函数题目
我们考虑每个石头的情况:
kkksc03:
金神石的块数必须是 6 的倍数。:
f
1
=
1
+
x
6
+
x
12
+
.
.
f1=1+x^6+x^{12}+..
f1=1+x6+x12+..
木神石最多用9块:
f
2
=
1
+
x
1
+
x
2
+
x
3
+
.
.
.
+
x
9
f2=1+x^1+x^2+x^3+...+x^9
f2=1+x1+x2+x3+...+x9
水神石最多用5块:
f
3
=
1
+
x
1
+
x
2
+
x
3
+
x
4
+
x
5
f3=1+x^1+x^2+x^3+x^4+x^5
f3=1+x1+x2+x3+x4+x5
火神石的块数必须是 4 的倍数。:
f
4
=
1
+
x
4
+
x
8
+
x
1
2
+
.
.
.
f4=1+x^4+x^{8}+x^12+...
f4=1+x4+x8+x12+...
土神石最多用7块:
f
5
=
1
+
x
1
+
x
2
+
x
3
+
x
4
+
x
5
+
x
6
+
x
7
f5=1+x^1+x^2+x^3+x^4+x^5+x^6+x^7
f5=1+x1+x2+x3+x4+x5+x6+x7
lzn大神:
金神石的块数必须是 2 的倍数。:
f
6
=
1
+
x
2
+
x
4
+
.
.
.
f6=1+x^2+x^{4}+...
f6=1+x2+x4+...
木神石最多用1块:
f
7
=
1
+
x
1
f7=1+x^1
f7=1+x1
水神石的块数必须是 8 的倍数:
f
8
=
1
+
x
8
+
x
16
+
x
24
+
.
.
.
.
f8=1+x^8+x^{16}+x^{24}+....
f8=1+x8+x16+x24+....
火神石的块数必须是 10 的倍数。:
f
9
=
1
+
x
10
+
x
20
+
x
30
+
.
.
.
f9=1+x^{10}+x^{20}+x^{30}+...
f9=1+x10+x20+x30+...
土神石最多用3块:
f
10
=
1
+
x
1
+
x
2
+
x
3
f10=1+x^1+x^2+x^3
f10=1+x1+x2+x3
答案就是:
F
=
f
1
∗
f
2
∗
f
3
∗
f
4
∗
f
5
∗
f
6
∗
f
7
∗
f
8
∗
f
9
∗
f
10
=
1
(
1
−
x
)
5
F=f1*f2*f3*f4*f5*f6*f7*f8*f9*f10=\\frac{1}{(1-x)^5}
F=f1∗f2∗f3∗f4∗f5∗f6∗f7∗f8∗f9∗f10=(1−x)51
1
(
1
−
x
)
5
=
∑
i
=
0
∞
C
5
+
i
−
1
i
x
i
=
∑
i
=
0
∞
C
4
+
i
i
x
i
\\frac{1}{(1-x)^5}=\\sum_{i=0}^{∞}C_{5+i-1}^{i}x^i=\\sum_{i=0}^{∞}C_{4+i}^{i}x^i
(1−x)51=i=0∑∞C5+i−1ixi=i=0∑∞C4+iixi
第n项的系数是:
C
4
+
n
n
=
(
n
+
4
)
(
n
+
3
)
(
n
+
2
)
(
n
+
1
)
4
!
C_{4+n}^{n}=\\frac{(n+4)(n+3)(n+2)(n+1)}{4!}
C4+nn=4!(n+4)(n+3)(n+2)(n+1)
因为n很大,高精度也没法计算,所以要用NTT加速一下
FFT/NTT如何实现高精度乘法的:
都是到FFT可以处理多项式乘法,那我们完全可以将一个高精度整数写成多项式形式。
对于每一个n的十进制数,我们可以看作一个n-1次多项式A,满足:
A
(
x
)
=
a
0
+
a
1
∗
1
0
1
+
a
2
∗
1
0
2
+
.
.
.
.
+
a
n
−
1
∗
1
0
n
−
1
A(x)=a_{0}+a_{1}*10^1+a_{2}*10^2+....+a_{n-1}*10^{n-1}
A(x)=a0+a1∗101+luogu P2000 拯救世界