1. 程式人生 > >斐波那契的整除(思維 & 數論)

斐波那契的整除(思維 & 數論)

題目連結 Time Limit:1000ms Memory Limit:65536K Description 已知斐波那契數列有如下遞迴定義,f(1)=1,f(2)=1, 且n>=3,f(n)=f(n-1)+f(n-2),它的前幾項可以表示為1, 1,2 ,3 ,5 ,8,13,21,34…,現在的問題是想知道f(n)的值是否能被3和4整除,你知道嗎? Input 輸入資料有若干組,每組資料包含一個整數n(1< n <1000000000)。 Output 對應每組資料n,若 f(n)能被3整除,則輸出“3”; 若f(n) 能被4整除,則輸出“4”;如果能被12整除,輸出“YES”;否則輸出“NO”。 Sample Input

4 6 7 12 Sample Output 3 4 NO YES

這道題目資料量是很大的,別說時間上,就在資料型別裡面也是沒有能裝的下第1e9個斐波那契數的,所以暴力的方法就不要想了,只能就是找規律。只有3、4、12的話,看起來關係是很近的,可以找一下有沒有迴圈節。最後可以找出來:fn 當且僅當n可以被4整除時可以被3整除。同理當且僅當n可以被6整除時可以被4整除,當且僅當n可以被12整除時可以被12整除。所以就是一串if else了。 AC程式碼:

#include <cstdio>
using namespace std;

int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        if(n % 12 == 0) printf("YES\n");
        else if(n % 6 == 0) printf("4\n");
        else if(n % 4 == 0) printf("3\n");
        else    printf("NO\n");
    }
    return 0;
}