[HDU6467] 简单数学题

前言

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

题目

HDU

讲解

就单纯推式子

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

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

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

\[\begin{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} \]

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

\[\begin{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 \]

作差即可得到:

\[\begin{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,'\n');
	return 0;
}
posted @ 2020-09-07 21:13  皮皮刘  阅读(152)  评论(0编辑  收藏  举报