可以把这些限制都列成生成函数:
1
+
x
2
+
x
4
+
.
.
.
=
1
1
−
x
2
1+x^2+x^4+...=\frac{1}{1-x^2}
1+x2+x4+...=1−x21
1
+
x
1+x
1+x
1
+
x
+
x
2
=
1
−
x
3
1
−
x
1+x+x^2=\frac{1-x^3}{1-x}
1+x+x2=1−x1−x3
x
+
x
3
+
x
5
+
.
.
.
=
x
1
−
x
2
x+x^3+x^5+...=\frac{x}{1-x^2}
x+x3+x5+...=1−x2x
1
+
x
4
+
x
8
+
.
.
.
=
1
1
−
x
4
1+x^4+x^8+...=\frac{1}{1-x^4}
1+x4+x8+...=1−x41
1
+
x
+
x
2
+
x
3
=
1
−
x
4
1
−
x
1+x+x^2+x^3=\frac{1-x^4}{1-x}
1+x+x2+x3=1−x1−x4
1
+
x
3
+
x
6
+
.
.
.
=
1
1
−
x
3
1+x^3+x^6+...=\frac{1}{1-x^3}
1+x3+x6+...=1−x31
将所有式子相乘得到的多项式的
x
n
x^n
xn的系数就是答案
相乘得到:
x
(
1
−
x
)
4
=
x
×
(
1
+
x
+
x
2
+
.
.
.
)
4
\frac{x}{(1-x)^4}=x\times (1+x+x^2+...)^4
(1−x)4x=x×(1+x+x2+...)4
因为不想推公式,可以用组合数学的思想,
x
n
x^n
xn的系数就相当于把
n
−
1
n-1
n−1拆分成四个有序整数的方案数,就可以用隔板法
C
n
+
m
−
1
m
−
1
C_{n+m-1}^{m-1}
Cn+m−1m−1得到答案为
C
n
+
2
3
C_{n+2}^3
Cn+23
也就是 n × ( n + 1 ) × ( n + 2 ) 6 \frac{n\times(n+1)\times(n+2)}{6} 6n×(n+1)×(n+2),输入 n n n的时候边输入边取模就好了
放上优秀
0
m
s
0ms
0ms 代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define LL long long
using namespace std;
const int mod=10007;
inline int rd(){
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();
while(c<='9' && c>='0') x=(x*10+c-'0')%mod,c=getchar();
return x*f;
}
inline int qpow(int x,int k){
int ret=1;
while(k){
if(k&1) ret=ret*x%mod;
x=x*x%mod; k>>=1;
} return ret;
}
int main(){
int n=rd();
printf("%lld\n",1LL*n*(n+1)%mod*(n+2)%mod*qpow(6,mod-2)%mod);
return 0;
}