这个题目很简单了,就是斐波那契数列~
至于直接加的方法应该会超时的(没试,不过应该会超时)。
所以用矩阵快速幂的方法(假如不知道快速幂怎么做,请看我上面的博客:http://blog.youkuaiyun.com/alps1992/article/details/42131581)
就比较简单了~ 其实就是构造矩阵。
代码如下:
//
// main.cpp
// hdu_1021
//
// Created by Alps on 14/12/28.
// Copyright (c) 2014年 chen. All rights reserved.
//
// 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
//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.
#include <iostream>
using namespace std;
int MultiMatrix(int a[2][2], int b[2][2]){
int temp[2][2];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
temp[i][j] = a[i][0]*b[0][j] + a[i][1]*b[1][j];
}
}
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
a[i][j] = temp[i][j];
}
}
return a[0][0];
}
int main(int argc, const char * argv[]) {
int n;
int ans;
while (scanf("%d",&n) != EOF) {
if (n == 0 || n == 1) {
printf("no\n");
continue;
}
n -= 1;
int cp[2][2] = {1,0,0,1};
int init[2][2] = {1,1,1,0};
int matrix[2][2] = {11,7,7,4};
while (n & 1) {
MultiMatrix(cp, init);
MultiMatrix(init, init);
n = n>>1;
}
ans = MultiMatrix(matrix, cp);
if (ans % 3 == 0) {
printf("yes\n");
}else{
printf("no\n");
}
}
return 0;
}