[海军国际项目办公室]乘法
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[海军国际项目办公室]乘法相关的知识,希望对你有一定的参考价值。
乘法
题目概述
题解
显然,我们去掉末尾
0
0
0保留的最后
16
16
16位,转化成二进制位后末尾的
0
0
0不可能超过
3
3
3个,我们可以将原来
n
!
n!
n!中的
0
0
0全部去掉,最后在求出
0
0
0的个数,模
4
4
4后乘上。
既然,我们已经去掉所有的
2
2
2的倍数了,那么我们乘的肯定都是奇数,我们可以按照原数中含
2
2
2的个数分类,定义
f
n
=
∏
i
∈
[
1
,
n
]
,
2
∤
i
i
f_{n}=\\prod_{i\\in[1,n],2 \\nmid i}i
fn=∏i∈[1,n],2∤ii,显然有
A
n
s
=
∏
i
=
0
log
n
f
n
2
i
Ans=\\prod_{i=0}^{\\log\\,n}f_{\\frac{n}{2^i}}
Ans=i=0∏lognf2in
我们考虑
f
n
f_n
fn怎么算,显然我们的所有奇数都是可以用
2
k
+
1
(
k
∈
N
)
2k+1(k\\in N)
2k+1(k∈N)的形式表示的,那么我们
f
f
f的式子可以写成,
f
n
=
∏
i
=
0
⌊
n
−
1
2
⌋
(
2
i
+
1
)
f_{n}=\\prod_{i=0}^{\\lfloor\\frac{n-1}{2}\\rfloor}(2i+1)
fn=i=0∏⌊2n−1⌋(2i+1)
由于我们只会保留前面的
64
64
64位,我们可以将它看成一个多项式,令
x
=
2
x=2
x=2,取模
x
64
x^{64}
x64。
令
F
F
F为该多项式,有,
F
(
x
)
=
∏
i
=
0
⌊
n
−
1
2
⌋
(
i
x
+
1
)
(
m
o
d
x
64
)
f
=
∑
i
=
0
63
2
i
F
[
x
i
]
F(x)=\\prod_{i=0}^{ \\lfloor\\frac{n-1}{2}\\rfloor}(ix+1)\\,\\,(\\mod x^{64})\\\\ f=\\sum_{i=0}^{63}2^iF[x^i]
F(x)=i=0∏⌊2n−1⌋(ix+1)(modx64)f=i=0∑632iF[xi]
我们不妨记
u
p
=
⌊
n
−
1
2
⌋
up=\\lfloor\\frac{n-1}{2}\\rfloor
up=⌊2n−1⌋,记
g
(
u
p
,
i
)
=
(
∏
i
=
0
u
p
(
i
x
+
1
)
)
[
x
i
]
g(up,i)=(\\prod_{i=0}^{up}(ix+1))[x^i]
g(up,i)=(∏i=0up(ix+1))[xi]。
考虑如何快速地求出我们的
g
(
u
p
,
i
)
[
i
∈
[
0
,
63
]
]
g(up,i)[i\\in[0,63]]
g(up,i)[i∈[0,63]]
考虑我们上面多项式系数的组合意义,
F
[
x
i
]
F[x^i]
F[xi]相当于在
[
1
,
u
p
]
[1,up]
[1,up]中选出
i
i
i个数,将每个方案中选出的数的积求和。
没有重复元素的无序序列的乘积,这就显然是可以背包求出的了。
我们考虑在前面的无序序列的最后加一个数,这数可能与前面的数重复,就需要容斥,枚举重复的元素个数,
g
(
x
,
i
)
=
1
i
∑
j
=
1
i
(
−
1
)
j
−
1
g
(
x
,
i
−
j
)
∑
y
∈
[
1
,
x
]
y
j
g(x,i)=\\frac{1}{i}\\sum_{j=1}^{i}(-1)^{j-1}g(x,i-j)\\sum_{y\\in[1,x]}y^j
g(x,i)=i1j=1∑i(−1)j−1g(x,i−j)y∈[1,x]∑yj
该重复的数在
[
1
,
x
]
[1,x]
[1,x]中是什么都有可能,因为序列求的是乘积,所以我们肯定是将重复的数的幂与
g
(
x
,
i
−
j
)
g(x,i-j)
g(x,i−j)相乘,得到新的序列的乘积。
而不同的序列之间求的是加减,所以是幂和。
关于
∑
y
∈
[
1
,
x
]
y
j
\\sum_{y\\in[1,x]}y^j
∑y∈[1,x]yj的求法,我们在微信步数中讲到过的,可以通过斯特林数反演求出,所以有,
g
(
x
,
i
)
=
1
i
∑
j
=
1
i
(
−
1
)
j
−
1
g
(
x
,
i
−
j
)
∑
k
=
1
j
k
!
{
j
k
}
(
x
+
1
k
+
1
)
g(x,i)=\\frac{1}{i}\\sum_{j=1}^{i}(-1)^{j-1}g(x,i-j)\\sum_{k=1}^{j}k!{j\\brace k}\\binom{x+1}{k+1}
g(x,i)=i1j=1∑i(−1)j−1g(x,i−j)k=1∑jk!{kj}(k+1x+1)
后面的
∑
k
=
1
j
k
!
{
j
k
}
(
x
+
1
k
+
1
)
\\sum_{k=1}^{j}k!{j\\brace k}\\binom{x+1}{k+1}
∑k=1jk!{kj