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

原题题面

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

题面分析

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值