这个题目很简单了,就是斐波那契数列~
至于直接加的方法应该会超时的(没试,不过应该会超时)。
所以用矩阵快速幂的方法(假如不知道快速幂怎么做,请看我上面的博客:http://blog.csdn.net/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; }