这是一个题Fibonacci Again
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2). Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000). Print the word "yes" if 3 divide evenly into F(n). Print the word "no" if not.
鄙人知道有规律(n-2)%4==0就YES;但还是想用迭代做一下;
迭代函数到11808就算不了了(用二分凑出来的),查了查map,vector的容量也没超啊(学生党哭哭)
#include<bits/stdc++.h>
#define V vector<int>
using namespace std;
map<int,V> fi;
V add(V &A,V &B);
int num;
V Fibonacci(int n){
if(n==0)return fi[0];//f(0)=7
if(n==1)return fi[1];//f(1)=11
if(fi[n].size()!=0)return fi[n];//存进map里
//cout<<num++<<endl;
Fibonacci(n-1);//递归运算第一个
Fibonacci(n-2);//递归运算第二个
return fi[n]=add(fi[n-1],fi[n-2]);//相加
}
int main(){
fi[0].push_back(7);
fi[1].push_back(11);
Fibonacci(11807); //11808就不行
//for(int i=0;i<10000;i++){
//for(int j=fi[11807].size()-1;j>=0;j--)cout<<fi[11807][j];
//}
int n;
while(scanf("%d",&n)!=EOF){
int sum=0;
for(int i=fi[n].size()-1;i>=0;i--)sum+=fi[n][i];
if(sum%3==0)printf("YES\n");
else printf("NO\n");
}
return 0;
}
V add(V &A,V &B){//高进度A+B
V C;
int t=0;
for(int i=0;i<A.size()||i<B.size();i++){
if(i<A.size())t+=A[i];
if(i<B.size())t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t)C.push_back(1);
return C;
}
首先....你用递归去算这么大的工作量明显不现实, 非常耗时间, 这时候dp快很多
其次....别说int, 我怀疑long long都不够用....建议写string大数模板....
你知道11801是多大了吗?
不知道,反正我用vs2017一运行就报错了。应该是数值计算太大了,超出范围了吧!
您好,我是问答小助手,看到您的问题已被解答,欢迎您加入CSDN!
目前问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632