题目描述
思路
设数列
F
(
n
)
=
F
(
n
−
1
)
+
F
(
n
−
2
)
,
n
>
=
2.
F(n)=F(n-1)+F(n-2),n>=2.
F(n)=F(n−1)+F(n−2),n>=2.
对应除以3后的余数为
G
(
n
)
.
G(n).
G(n).
那么,
G
(
n
)
=
G
(
n
−
1
)
+
G
(
n
−
2
)
3
.
G(n)=\frac{G(n-1)+G(n-2)}{3}.
G(n)=3G(n−1)+G(n−2).很容易想到在
0
<
n
<
1
0
9
0<n<10^9
0<n<109情况下,用打表找规律的方法
a,b分别会有三种余数值(0,1,2),那么a,b的情况就会有
3
2
=
9
3^2=9
32=9种,打表观察后发现:
1、如果
G
(
0
)
=
G
(
1
)
=
0
⇒
G
(
n
)
=
0.
G(0)=G(1)=0\Rightarrow G(n)=0.
G(0)=G(1)=0⇒G(n)=0.
2、如果
G
(
0
)
与
G
(
1
)
不
同
时
为
0
⇒
从
能
被
3
整
除
的
第
一
项
开
始
,
每
4
项
成
立
一
次
.
G(0)与G(1)不同时为0\Rightarrow 从能被3整除的第一项开始,每4项成立一次.
G(0)与G(1)不同时为0⇒从能被3整除的第一项开始,每4项成立一次.
代码
#include<bits/stdc++.h>
#define N 100
using namespace std;
int fib(int a,int b,int n){
if(n==0) return a;
if(n==1) return b;
else return fib(a,b,n-1)+fib(a,b,n-2);
}
int main(){
int T;
cin>>T;
while(T--){
int a,b,m,n;
cin>>a>>b>>m;
int t;
//a b都是3的倍数时,输入任意n输出Yes
if(a%3==0&&b%3==0){
while(m--){
cin>>n;
cout<<"Yes"<<endl;
}
}else{
//找出成立的第一项下标,下标每增加4,成立一次
for(int i=0;i<N;i++){
if(fib(a,b,i)%3==0){
t=i;
break;
}
}
while(m--){
cin>>n;
if((n-t)%4==0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
cout<<endl;
}
return 0;
}
2
10 14 9
0
No
1
No
2
Yes
4
No
5
No
325684
No
2569853
No
987654321
No
999999999
No
6 13 3
7
No
589
No
125328936
Yes
--------------------------------