CF185A(Div 1 A) Plant

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guapi2333/article/details/83506001

链接:https://www.luogu.org/problemnew/show/CF185A

Problem:

已知初始状态有1个正着放的正三角形(第0秒)。之后每一秒都会产生两个上一秒状态的正置的分型和一个倒置的分形。求在第n秒时有多少个正置(正着放)的正三角形。(0\leq n\leq 10^{18})

数学推一波:

因为每一秒钟都会产生3个上一秒状态的分形,所以第i秒共有4^{i}个三角形。

f{}_{i}为第i秒时正置的正三角形的个数,那么在第i秒时,产生了2个和第i-1秒的状态一样的分形,故而这两个新的分形的正置的正三角形的个数=f{}_{i-1}。倒置的新分型中正放的三角形的个数则=第i-1秒时三角形的总个数—f{}_{i-1},即4^{i-1}-f_{i-1}

整理以上的式子:

                                                                                 f_{i}=3f_{i-1}+4^{i-1}-f_{i-1}

即:                                                                               f_{i}=2f_{i-1}+4^{i-1}

由于n的范围过大,所以说我们要利用递推式求通项公式(这不就是个数列中的构造法吗emmm。太高中数学了)。

高中数学一波:已知f_{0}=1,f_{i}=2f_{i-1}+4^{i-1}(i\in N^{*})。求f的通项公式。

构造法:构造等比数列。

f_{i}+\lambda\times 4^{i}=2(f_{i-1}+\lambda\times4^{i-1} ),化简:

                                            f_{i}+\lambda\times 4^{i}=2(f_{i-1}+\lambda\times4^{i-1} )\Leftrightarrow f_{i}=2f_{i-1}-2\lambda\times4^{i-1}

\therefore -2\lambda\times 4^{i-1}=4^{i-1}             

\lambda=-\frac{1}{2}

\therefore f_{i}-2^{2i-1}=2(f_{i-1}-2^{2i-2})

\because f_{1}-2^{2\times 1-1}=1

\therefore新数列f_{i}是以1为首项,2为公比的等比数列。

\therefore f_{i}-2^{2i-1}=2^{i-1}

 \therefore f_{i}=2^{2i-1}+2^{i-1}(i\in N)

这个我们用快速幂便可以实现O(log_{2}n)求解。

注意由于f_{0}=\frac{1}{2}+\frac{1}{2},在整数运算中计算的结果为0,故对n=0的情况需要特判。

Code:

#include<cstdio>
#include<iostream>
using namespace std;

const long long MOD=1000000007;
int cnt;
long long n,tot,x1,x2,que[120];

long long power(long long x,long long ci)
//不得不吐槽一下CF,为什么写递归版的快速幂会RE啊emmm
{
    if(ci==0)	return 1;
    if(ci==1)	return x;
    cnt=0;
    long long ans=x;
    while(ci>0)//循环版快速幂
    {
    	que[++cnt]=ci;
    	ci/=2;
    }
    for(int i=cnt-1;i>=1;i--)
    {
    	ans=(ans*ans)%MOD;
    	if(que[i]==2*que[i+1]+1)  ans=(ans*x)%MOD;	
    }
    return ans;
}

int main()
{
    cin>>n;
    if(n==0)  { cout<<"1"; return 0; }//对n=0的情况特判
    x1=power(2,n-1),x2=power(2,2*n-1);
    tot=(x1+x2)%MOD;
    cout<<tot;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/guapi2333/article/details/83506001