HDU 6467 简单数学题 广东工业大学第十四届程序设计竞赛 组合恒等式 + 快速幂
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=6467
题意
求 F ( n ) = ∑ i = 1 n ( i ∗ ∑ j = i n C j i ) m o d ( 1 e 9 + 7 ) 求F(n)=\sum_{i=1}^n(i*\sum_{j=i}^nC_j^i)\;\;mod \;\;(1e9+7) 求F(n)=i=1∑n(i∗j=i∑nCji)mod(1e9+7)
思路
先
将
F
(
n
)
展
开
:
先将F(n)展开:
先将F(n)展开:
F
(
n
)
=
1
∗
∑
j
=
1
n
C
j
1
+
2
∗
∑
j
=
2
n
C
j
2
+
.
.
.
+
(
n
−
1
)
∑
j
=
n
−
1
n
C
j
n
−
1
+
n
∑
j
=
n
n
C
j
n
F(n)=1*\sum_{j=1}^nC_j^1+2*\sum_{j=2}^nC_j^2+...+(n-1)\sum_{j=n-1}^nC_j^{n-1}+n\sum_{j=n}^nC_j^n
F(n)=1∗j=1∑nCj1+2∗j=2∑nCj2+...+(n−1)j=n−1∑nCjn−1+nj=n∑nCjn
将
F
(
n
−
1
)
展
开
:
将F(n-1)展开:
将F(n−1)展开:
F
(
n
)
=
1
∗
∑
j
=
1
n
−
1
C
j
1
+
2
∗
∑
j
=
2
n
−
1
C
j
2
+
.
.
.
+
(
n
−
1
)
∑
j
=
n
−
1
n
−
1
C
j
n
−
1
F(n)=1*\sum_{j=1}^{n-1}C_j^1+2*\sum_{j=2}^{n-1}C_j^2+...+(n-1)\sum_{j=n-1}^{n-1}C_j^{n-1}
F(n)=1∗j=1∑n−1Cj1+2∗j=2∑n−1Cj2+...+(n−1)j=n−1∑n−1Cjn−1
上 式 减 下 式 得 : 上式减下式得: 上式减下式得:
F
(
n
)
−
F
(
n
−
1
)
=
F(n)-F(n-1)=
F(n)−F(n−1)=
C
n
1
+
2
∗
C
n
2
+
.
.
.
+
(
n
−
1
)
C
n
n
−
1
+
n
C
n
n
C_n^1+2*C_n^2+...+(n-1)C_{n}^{n-1}+nC_{n}^n
Cn1+2∗Cn2+...+(n−1)Cnn−1+nCnn
n ∗ C n − 1 0 + n ∗ C n − 1 1 + . . . + n ∗ C n − 1 n − 1 n*C_{n-1}^0+n*C_{n-1}^1+...+n*C_{n-1}^{n-1} n∗Cn−10+n∗Cn−11+...+n∗Cn−1n−1
这 里 可 能 有 点 看 不 清 楚 , 比 如 r C n r = r ∗ n ! r ! ∗ ( n − r ) ! , 拿 出 一 个 n , 消 去 一 个 r 得 n ∗ ( n − 1 ) ! ( r − 1 ) ! ( n − r ) ! = n ∗ C n − 1 r − 1 。 这里可能有点看不清楚,比如rC_n^r=r*\frac{n!}{r!*(n-r)!},拿出一个n,消去一个r得n*\frac{(n-1)!}{(r-1)!(n-r)!}=n*C_{n-1}^{r-1}。 这里可能有点看不清楚,比如rCnr=r∗r!∗(n−r)!n!,拿出一个n,消去一个r得n∗(r−1)!(n−r)!(n−1)!=n∗Cn−1r−1。
由 二 项 式 定 理 得 : 由二项式定理得: 由二项式定理得:
F ( n ) − F ( n − 1 ) = n ∗ 2 n − 1 F(n)-F(n-1)=n*2^{n-1} F(n)−F(n−1)=n∗2n−1
即 得 到 如 下 式 子 : 即得到如下式子: 即得到如下式子:
F ( n ) = { 1 n = 1 F ( n − 1 ) + n ∗ 2 n − 1 n > 1 F(n)=\left\{\begin{matrix} 1 &n=1 & \\ F(n-1)+n*2^{n-1}& n>1 & \end{matrix}\right. F(n)={1F(n−1)+n∗2n−1n=1n>1
上 式 明 显 是 一 个 递 推 公 式 , 所 以 F ( n ) 是 一 个 差 比 数 列 的 前 n 项 和 , 错 位 相 减 法 即 可 。 上式明显是一个递推公式,所以F(n)是一个差比数列的前n项和,错位相减法即可。 上式明显是一个递推公式,所以F(n)是一个差比数列的前n项和,错位相减法即可。
有 一 个 差 比 数 列 的 公 式 , 高 中 还 记 得 , 现 在 就 不 记 得 。 。 。 有一个差比数列的公式,高中还记得,现在就不记得。。。 有一个差比数列的公式,高中还记得,现在就不记得。。。
对 于 数 列 ( A n + B ) q n − 1 , ( 1 − q ) S n = ( A + B ) + ( A 1 − q ) q − ( A n + B + A 1 − q ) q n 。 对于数列(An+B)q^{n-1},(1-q)S_n=(A+B)+(\frac{A}{1-q})q-(An+B+\frac{A}{1-q})q^n。 对于数列(An+B)qn−1,(1−q)Sn=(A+B)+(1−qA)q−(An+B+1−qA)qn。
最 后 得 出 F ( n ) = ( n − 1 ) ∗ 2 n + 1 , 快 速 幂 处 理 一 下 即 可 。 最后得出F(n)=(n-1)*2^{n}+1,快速幂处理一下即可。 最后得出F(n)=(n−1)∗2n+1,快速幂处理一下即可。
Code(405MS)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll quick_pow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) {
ans = ans * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return ans % mod;
}
int main() {
ll n;
while(scanf("%lld",&n) != EOF) {
printf("%lld\n",(1 + (n - 1) % mod * quick_pow(2, n) % mod + mod) % mod);
}
}