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; }