题目大意:有一排砖头要上色,有四种颜色,其中两种用的数量必须是偶数,另外两种不限制用的数量,四种颜色的都有无限量的存储,求涂色方案。
要解决的是排列问题
直接构造指数型生成函数:
(
1
+
x
2
2
!
+
x
4
4
!
+
.
.
.
.
)
2
∗
(
1
+
x
+
x
2
2
!
+
x
3
3
!
+
.
.
)
2
=
(
e
x
+
e
−
x
2
)
2
∗
e
2
x
(1 + \frac{x ^ 2}{2!} + \frac{x ^ 4}{4!}+....)^2*(1 +x +\frac{x ^ 2}{2!} + \frac{x ^ 3}{3!} + ..)^2 = (\frac{e^x + e^{-x}}{2})^2 * e^{2x}
(1+2!x2+4!x4+....)2∗(1+x+2!x2+3!x3+..)2=(2ex+e−x)2∗e2x
=
e
4
x
+
1
+
2
∗
e
2
x
4
=
1
4
+
1
4
∑
(
4
n
+
2
n
+
1
)
∗
x
n
n
!
=\frac{e^{4x} + 1 + 2 * e^{2x}}{4}=\frac{1}{4} + \frac{1}{4}\sum(4^n+2^{n+1})*\frac{x^n}{n!}
=4e4x+1+2∗e2x=41+41∑(4n+2n+1)∗n!xn
答案就是
4
n
+
2
n
+
1
4
\frac{4^n + 2^{n + 1}}{4}
44n+2n+1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 10007;
ll fpow(ll a,ll b) {
ll r = 1;
while(b) {
if(b & 1) r = r * a % mod;
a = a * a % mod;
b >>= 1;
}
return r;
}
int t,n;
int main() {
scanf("%d",&t);
ll inv = fpow(4,mod - 2);
while(t--) {
scanf("%d",&n);
printf("%lld\n",(fpow(4,n) + fpow(2,n + 1)) % mod * inv % mod);
}
return 0;
}