HDU - 1021ACM

来源:互联网 发布:重生网络女主播txt 编辑:程序博客网 时间:2024/06/06 11:59

这个题目很简单了,就是斐波那契数列~

至于直接加的方法应该会超时的(没试,不过应该会超时)。

所以用矩阵快速幂的方法(假如不知道快速幂怎么做,请看我上面的博客: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;}


0 0
原创粉丝点击