HDU 6467 简单数学题 广东工业大学第十四届程序设计竞赛

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=1n(ij=inCji)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)=1j=1nCj1+2j=2nCj2+...+(n1)j=n1nCjn1+nj=nnCjn
将 F ( n − 1 ) 展 开 : 将F(n-1)展开: F(n1)
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)=1j=1n1Cj1+2j=2n1Cj2+...+(n1)j=n1n1Cjn1

上 式 减 下 式 得 : 上式减下式得:

F ( n ) − F ( n − 1 ) = F(n)-F(n-1)= F(n)F(n1)=
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+2Cn2+...+(n1)Cnn1+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} nCn10+nCn11+...+nCn1n1

这 里 可 能 有 点 看 不 清 楚 , 比 如 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=rr!(nr)!n!nrn(r1)!(nr)!(n1)!=nCn1r1

由 二 项 式 定 理 得 : 由二项式定理得:

F ( n ) − F ( n − 1 ) = n ∗ 2 n − 1 F(n)-F(n-1)=n*2^{n-1} F(n)F(n1)=n2n1

即 得 到 如 下 式 子 : 即得到如下式子:

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(n1)+n2n1n=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)qn1(1q)Sn=(A+B)+(1qA)q(An+B+1qA)qn

最 后 得 出 F ( n ) = ( n − 1 ) ∗ 2 n + 1 , 快 速 幂 处 理 一 下 即 可 。 最后得出F(n)=(n-1)*2^{n}+1,快速幂处理一下即可。 F(n)=(n1)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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值