斐波那契的整除

链接: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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值