Project Euler #624 Two heads are better than one
【题目描述】
传送门
【题解】
最后我们可以通过打表或推理得到这个式子G(n)=∑i=1∞2i∗nf(i∗n−1),其中f(i)为斐波那契数列。
我们知道f(i)=55((21+5)i−(21−5)i)
将f(i)代入G(n)=∑i=1∞105((41+5)i∗n−1−(41−5)i∗n−1)=105(∑i=1∞(41+5)i∗n−1−∑i=1∞(41−5)i∗n−1)
就变成了两个等比数列的差。
因为41+5,41−5∈(−1,1)
所以无限项的通项公式就是1−qa1
代入就可以了。
【代码如下】
#include<cstdio>
using namespace std;
typedef long long LL;
const LL MOD=1e9+9,NI=383008016;
LL n;
LL qsm(LL x,LL b){
LL Mul=1;x=(x%MOD+MOD)%MOD;
for(;b;b>>=1,x=1ll*x*x%MOD) if(b&1) Mul=1ll*Mul*x%MOD;
return Mul;
}
int main(){
freopen("coin.in","r",stdin);
freopen("coin.out","w",stdout);
scanf("%lld",&n);
LL A=qsm(1+NI ,n-1)*4%MOD*qsm(qsm(4,n)-qsm(1+NI,n),MOD-2)%MOD;
LL B=qsm(1-NI+MOD,n-1)*4%MOD*qsm(qsm(4,n)-qsm(1-NI,n),MOD-2)%MOD;
printf("%lld\n",NI*qsm(10,MOD-2)%MOD*(((A-B)%MOD+MOD)%MOD)%MOD);
return 0;
}