Freda的访客 【找规律+快速幂】

题目描述

N 只小猫来到了Freda 的城堡做客!Freda 很高兴,拿出了蛋糕和饼干来招待它们,每一只小猫都可以吃到蛋糕或者饼干,当然,每只小猫具体拿到的是蛋糕还是饼干是由Freda 决定的。

小猫们看到蛋糕比饼干大之后,普遍认为蛋糕比饼干要好>.<。所以,如果Freda 给了第i 只小猫蛋糕且这个小猫是第一个吃到蛋糕的,那么就必须给第i+2,i+4,i+6......只小猫蛋糕。
也就是说,如果存在正整数i,满足:
1、对于所有的0<j<i,第j 只小猫吃到的是饼干
2、第i 只小猫吃到的是蛋糕
那么就必须有:
对于所有的i<k<=N, k mod 2 = i mod 2,第k 只小猫吃到的是蛋糕。
小猫的数目一多,Freda 就忙不过来了。请你帮忙计算,Freda 一共有多少种可能的方法来招待这N 只小猫?

 

分析

详见大犇博客解析:

http://blog.163.com/accelerator_sw/blog/static/27326128420175481419341/

 

在这里附上我的代码:

 

 

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#define m 1000000007

using namespace std;

long long n;

long long poww(long long p)

{

    if(p==0) return 1;

    long long tmp=poww(p/2)%m;

    tmp=(tmp*tmp)%m;

    if(p%2==1)

        tmp*=2;

    tmp%=m;

    return tmp;    

}



int main()

{

    cin>>n;

    if((n-1)%2==1)

    {

        long long x=n/2;

        cout<<((poww(x)-1)*2+poww(x))%m<<endl;

    }

    else

    {

        long long x=(n-1)/2;

        cout<<((poww(x+1)-1)*2)%m<<endl;

    }

    return 0;


}
View Code

 

posted @ 2017-07-19 15:46  Captain_fcj  阅读(197)  评论(0编辑  收藏  举报