博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 1005
阅读量:5164 次
发布时间:2019-06-13

本文共 1231 字,大约阅读时间需要 4 分钟。

以下来自:http://www.cnblogs.com/krisdy/archive/2009/04/12/1434013.html
1、必然会出现循环
这是基于下面事实:
1. R(n+2)=F(n+2) mod P=(F(n+1)+F(n)) mod P=(F(n+1) mod p +F(n) modp) mod p
2. 斐波那契数列的最大公约数定理:gcd(F(m),F(n))=F(gcd(m,n))
最大公约数定理表明如果F(k)能被N整除,则F(ik)也能被N整除,这就表明了斐波那契数列所含因子的周期性,下面列举:
因子:2,3,4,5, 6,7,8, 9,10,11,12
周期:3,4,6,5,12,8,6,12,15,10,12
我们称所生成的序列为剩余序列,那么一旦出现某个F(k) 能被N整除(这需证明我的一个猜想:对于任意素数P,F(P),F(P-1)和F(P+1)三个中定有一个能被P整除),以后F(ik)都能被N整除,亦即剩余序列周期地出现0,下一个剩余序列值为N-1种可能,总会重复,有两个相邻的重复该序列就一定重复,亦即具有周期性。
这个周期叫做皮萨诺周期
  2、正确思路是:因为mod7的关系,而且f(1)=f(2)=1,所以f(n)的值是循环分布的,而且一定会回到f(n-1)=f(n)=1,
//并且还可得出,这个循环不大于49,因为相邻连个f只有7种取值,这样f(n-1)和f(n)共有49种组合。
//所以,只要找出循环因子即可,寻找方法正是根据f(n-1)=f(n)再次出现的地方来计算
//可以首先为这个题目写一个测试的程序设定一个 a   b   n(n 比较小时)  的值   看看输出规律
  3、只要找到k使f[k-1] = f[n-1],f[k-2]=f[n-2];特别地,当k等于2时就可以了,
因为f[1],f[2]必然是循环的起始。又因为f[n-1],f[n-2]都只能取0到6共七个数,
因此有49种组合方式,也就是说50内必然可以找到满足条件的k,就是循环周期小于50。
#include <iostream>
using namespace std;
int func(int a,int b,int n)
{
    if(n==1)  return 1;
    else if(n==2)  return 1;
    else return (a*func(a,b,n-1)%7+b*func(a,b,n-2)%7)%7;
}
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    while(a!=0&&b!=0&&c!=0)
    {
    c=(c>48)?c%48:c;
    cout<<func(a,b,c)<<endl;
    cin>>a>>b>>c;
    }
    return 0;
}

转载于:https://www.cnblogs.com/CKboss/archive/2013/03/01/3351146.html

你可能感兴趣的文章
Python-常用模块及简单的案列
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
springboot jar包运行中获取资源文件
查看>>
基于FPGA实现的高速串行交换模块实现方法研究
查看>>
Java Scala获取所有注解的类信息
查看>>
delphi ,安装插件
查看>>
case when then的用法-leetcode交换工资
查看>>
11.28.cookie
查看>>
BeanShell简介
查看>>
python字符串操作
查看>>
不同程序语言的注释和变量要求
查看>>
语言基础(9):static, extern 和 inline
查看>>