斐波那契的整除

链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=115
原本这是一道题,但是可以从中提炼出方法。
对于题目的分析理解:
1、对于题目给出n的数据范围:1< n < 1 000 000 000暴力求解,再加上有多组数据,显然是要时间超限的节奏。所以就要耐心的动脑筋进行分析。
2、对于本题,我们无法直接透过题目可以分析想出好的、高效的算法,那么答案或者说求解的规律必定和n有着千丝万缕的联系,我们就可以大胆的进行打表进行寻找内在的联系。

#include <cstdio>
#include <iostream>
using namespace std;
const int maxn=90+5;  //定义数组大小,一般比容量多声明几个
const int maxm=90;    //打表容量
unsigned long long  a[maxn]; //装斐波那契数列的数组
unsigned long long  Fib(int n)
{
    if(a[n]!=0&&n>0) return a[n];
    return a[n]=Fib(n-1)+Fib(n-2);
}
int main()
{
    a[1]=1;a[2]=1;
    Fib(maxm);
    //for(int i=1;i<maxm;i++) {cout<<i<<' ';cout<<a[i]<<' ';if(a[i]%3==0) cout<<3<<' ';if(a[i]%4==0) cout<<4<<' ';if(a[i]%12==0)cout<<"Yes"<<endl;else cout<<"No"<<endl;}
    for(int i=1;i<maxm;i++)
    {
          if(a[i]%3==0) cout<<i<<' '<<a[i]<<endl; //输出满足%3 n的项和斐波那契数
//        if(a[i]%4==0) cout<<i<<' '<<a[i]<<endl; //输出满足%4 n的项和斐波那契数
//        if(a[i]%12==0) cout<<i<<' '<<a[i]<<endl;//输出满足%12 n的项和斐波那契数
    }
    return 0;
}
if(a[i]%3==0) cout<<i<<' '<<a[i]<<endl; //输出满足%3 n的项和斐波那契数

4 3
8 21
12 144
16 987
20 6765
24 46368
28 317811
32 2178309
36 14930352
40 102334155
44 701408733
48 4807526976
52 32951280099
56 225851433717
60 1548008755920
64 10610209857723
68 72723460248141
72 498454011879264
76 3416454622906707
80 23416728348467685
84 160500643816367088
88 1100087778366101931

if(a[i]%4==0) cout<<i<<' '<<a[i]<<endl; //输出满足%4 n的项和斐波那契数
6 8
12 144
18 2584
24 46368
30 832040
36 14930352
42 267914296
48 4807526976
54 86267571272
60 1548008755920
66 27777890035288
72 498454011879264
78 8944394323791464
84 160500643816367088

if(a[i]%12==0) cout<<i<<' '<<a[i]<<endl;//输出满足%12 n的项和斐波那契数
12 144
24 46368
36 14930352
48 4807526976
60 1548008755920
72 498454011879264
84 160500643816367088

我们在90的测试容量下,发现:
%3==0 的斐波那契数对应的n 对4取模等于0,也就是: if(n%4==0) a[i]%3==0 成立;
%4==0 的斐波那契数对应的n 对6取模等于0,也就是: if(n%6==0) a[i]%4==0 成立;
%12==0 的斐波那契数对应的n 对12取模等于0,也就是: if(n%12==0) a[i]%12==0 成立;
则最终的程序如下:

#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
    int n;
    while(cin >> n){
        if(n%12==0)
            cout << "YES" << endl;
        else{
            if(n%4==0)
                cout << "3" << endl;
            else{
                if(n%6==0)
                    cout << "4" << endl;
                else
                    cout << "NO" << endl;
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35937273/article/details/82155261