zoukankan      html  css  js  c++  java
  • [HDU6467] 简单数学题

    前言

    多写写数学题的题解,说不定就会了呢qwq

    题目

    HDU

    讲解

    就单纯推式子

    首先我们要先证明一个性质:

    [sum_{i=0}^n i*C_n^i=n*2^{n-1} ]

    [S=sum_{i=0}^n i*C_n^i ]

    [egin{aligned} 2S&=sum_{i=0}^n i*C_n^i+sum_{i=0}^n (n-i)*C_n^{n-i}\ &=sum_{i=0}^n i*C_n^i+sum_{i=0}^n (n-i)*C_n^i\ &=sum_{i=0}^n n*C_n^i\ &=n*sum_{i=0}^n C_n^i\ &=n*2^n end{aligned}]

    所以

    [S=n*2^{n-1} ]

    然后我们就可以愉快地推式子啦

    [egin{aligned} F(n)&=sum_{i=1}^n i*sum_{j=i}^n C_{j}^{i}\ &=sum_{i=1}^n sum_{j=1}^i j*C_i^j\ &=sum_{i=1}^n i*2^{i-1}\ &=sum_{i=0}^{n-1} (i+1)*2^{i} end{aligned}]

    类似的,我们求出(2F(n))

    [2F(n)=sum_{i=1}^n i*2^i ]

    作差即可得到:

    [egin{aligned} F(n)&=n*2^n-sum_{i=0}^{n-1}2^i\ &=n*2^n-(2^n-1)\ &=(n-1)*2^n+1 end{aligned}]

    快速幂实现即可

    代码

    int qpow(LL x,LL y,int MOD)
    {
    	LL ret = 1;y %= (MOD-1);
    	while(y){if(y & 1) ret = ret * x % MOD;x = x * x % MOD;y >>= 1;}
    	return ret;
    }
    
    int main()
    {
    //	freopen(".in","r",stdin);
    //	freopen(".out","w",stdout);
    	while(~scanf("%lld",&n)) Put(((n-1) % MOD * qpow(2,n,MOD) + 1) % MOD,'
    ');
    	return 0;
    }
    
  • 相关阅读:
    抖动代码
    WSAWaitForMultipleEvents()
    udp 不需要 listen
    WSAEventSelect
    C++ Win32控制台应用程序捕捉关闭事件
    玩转Win32开发(2):完整的开发流程
    win32线程池代码(WinApi/C++)
    又线程类封装
    Win2 Socket(套接字)相关 API
    Win32函数Sleep的精度测试
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/13629257.html
Copyright © 2011-2022 走看看