HDU 6467 简单数学题 广东工业大学第十四届程序设计竞赛 (数学推导+快速幂)

原题题面

已知
在这里插入图片描述
F ( n ) F(n) m o d mod 1 e 9 + 7 1e9+7

题面分析

乍一看,是个很难的题。
仔细一看,其实是个水题(手动滑稽保命)。
众所周知我们可以发现 Σ Σ 是通过构造 F ( n 1 ) F(n-1) 来消去的。
于是↓↓↓
在这里插入图片描述
两式相减得↓↓↓
在这里插入图片描述
看到这里有些聪明的读者就可能看出来了。
在这里插入图片描述
这是一个经典结论, 下面给出证明。
我们都知道
在这里插入图片描述
因此我们构造一个新的 F ( n ) F ( n 1 ) F(n)-F(n-1)
注意,构造 F ( n 1 ) F(n-1) 的前提是 n > 1 n>1 ,所以接下来所有的结论都只是对 n > 1 n>1 有效!
在这里插入图片描述
相加,合并同类项,得
在这里插入图片描述
再两边除2即可,证毕。
这里运用了一个高中数学的公式
在这里插入图片描述
证明略,参见二项式定理。
以上过程建议读者自己再推演一遍以加深印象。
OK,所以我们现在得到了 F ( n ) F(n)
在这里插入图片描述
显而易见,这种属于“一个等差 乘以 一个等比”的数列就要用 错位相减法
求和过程略,最后我们得到
在这里插入图片描述
注意到 n = 1 e 18 n=1e18 ,所以用快速幂处理。

AC代码(390ms)

#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long qsm(long long a,long long b,long long c)//快速幂
{
    long long ans=1,base=a;
    while(b!=0)
	{
        if(b&1)
        ans=ans*base%c;
        base=base*base%c;
        b>>=1;
	}
    return ans%c;
}
int main()
{
	long long n;
	while(~scanf("%lld",&n))
	{
		if(n==1)
			printf("1\n");//特殊情况要特判
		else
			printf("%lld\n",(1+((n-1)%mod)*(qsm(2,n,mod)%mod))%mod);//求和
	}
}

后记

没啥好说的,解题的思路和题面一样简单粗暴,多看几遍就对了。
笔者是个十八线的蒟蒻 A C M e r ACMer ,若文中有错误请在评论区下指出,我会尽量修正,谢谢! (土下座)
数列题全靠莽,大胆猜想,从不求证(滑稽)
DrGilbert 2018.8.21

猜你喜欢

转载自blog.csdn.net/oampamp1/article/details/99942408