一道简单的Fibonacci
时间限制: 1 Sec 内存限制: 32 MB
题目描述
有如下数列:F(0) = 7, F(1) = 11, F(n) = F(n - 1) + F(n - 2) (n >= 2)。
输入
输入由一系列的行构成,每一行包含一个正数 n (n < 1000000)。
输出
如果 F(n) 能被 3 整除,则输出 “Yes”,否则输出 “No”。
样例输入
0 1 2 3 4 5
样例输出
No No Yes No No No
解法一:打表+找规律
#include<bits/stdc++.h>
using namespace std;
int f(int n)
{
if(n==0) return 7;
if(n==1) return 11;
return f(n-1)+f(n-2);
}
int main()
{
for(int i=0;i<50;i++)
if(f(i)%3==0)
printf("%d:Yes\n",i);
else printf("%d:No\n",i);
return 0;
}
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n){
if((n-2)%4==0)
printf("Yes\n");
else printf("No\n");
}
return 0;
}
解法2:同余公式:(a+b)%mod=a%mod+b%mod
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f(int n)
{
if(n==0) return 7;
if(n==1) return 11;
int f0=7,f1=11,f2;
//同余公式:(a+b)%mod=a%mod+b%mod
for(int i=1;i<n;i++)
{
f2=f0+f1;
f0=f1%3;
f1=f2%3;
}
return f2;
}
int main()
{
int n;
while(cin>>n){
if(f(n)%3==0)
printf("Yes\n");
else printf("No\n");
}
return 0;
}
解法三:打表
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int a[maxn];
int main()
{
a[0]=7;a[1]=11;
for(int i=2;i<maxn;i++)
{
a[i]=a[i-1]+a[i-2];
a[i-1]%=3;a[i-2]%=3;
}
int n;
while(cin>>n){
if(a[n]%3==0)
printf("Yes\n");
else printf("No\n");
}
return 0;
}