原题题面
已知
求
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(n−1)来消去的。
于是↓↓↓
两式相减得↓↓↓
看到这里有些聪明的读者就可能看出来了。
这是一个经典结论, 下面给出证明。
我们都知道
因此我们构造一个新的
F
(
n
)
−
F
(
n
−
1
)
F(n)-F(n-1)
F(n)−F(n−1)
注意,构造
F
(
n
−
1
)
F(n-1)
F(n−1)的前提是
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