Fibonacci Again
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 69786 Accepted Submission(s): 32055
Problem Description
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).
Input
Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000).
Output
Print the word "yes" if 3 divide evenly into F(n).
Print the word "no" if not.
Print the word "no" if not.
Sample Input
0 1 2 3 4 5
Sample Output
no no yes no no no
Author
Leojay
看到这道题第一眼想到的就是矩阵快速幂,可能有更加巧妙的方法,但我还是直接暴力对每一项对3求余(在求F[n]的过程中)
然后直接判断F[n]是否为0
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 100
typedef long long ll;
struct mat
{
ll m[MAXN][MAXN];
}unit;
ll n;
mat msub(mat a,mat b)
{
mat ret;
ll x;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
x=0;
for(int k=0;k<4;k++)
{
x+=(a.m[i][k]*b.m[k][j])%3;
}
ret.m[i][j]=x%3;
}
}
return ret;
}
void init_unit()
{
for(int i=0;i<MAXN;i++)
{
unit.m[i][i]=1;
}
}
mat qpow(mat a,ll x)
{
mat ans=unit;
while(x)
{
if(x&1) ans=msub(a,ans);
a=msub(a,a);
x>>=1;
}
return ans;
}
int solve(ll n)
{
mat a;
a.m[0][0]=1;
a.m[0][1]=1;
a.m[1][0]=1;
a.m[1][1]=0;
mat b;
b.m[0][0]=11;
b.m[0][1]=7;
b.m[1][0]=7;
b.m[1][1]=0;
mat ans;
ans=msub(qpow(a,n-1),b);
return ans.m[0][0];
}
int main()
{
init_unit();
while(cin>>n)
{
if(!n) cout<<"no"<<endl;
else
{
if(solve(n)) cout<<"no"<<endl;
else cout<<"yes"<<endl;
}
}
return 0;
}