今天将来学习如何求广义Fibonacci数列的循环节。

问题:给定,满足,求的循

环节长度。

来源:http://acdreamoj.sinaapp.com/ 1075题

 

分析:我们知道矩阵的递推关系如下

然后继续有

那么,现在的问题就转化为求最小的,使得

所以我们可以先找出符合条件的一个,然后枚举它的因子,找最小的。设

为了好解决问题,我们需要对矩阵进行相似对角化,即,我们先来求的特征值。

解得的特征值为

也就是说的相似对角矩阵

因为我们知道,所以当时,, 由于

继续得到

,那么分情况讨论:

(1)是模的二次剩余,由费马小定理得时,

(2)是模的二次非剩余,则有

根据欧拉准则有

那么继续得到

然后由费马小定理有,同理有

所以,当时,

(3)时,由于不存在,所以无法完成相似对角化,好在这种情况不存在。

所以综上所述:

是模的二次剩余时,枚举的因子

是模的二次非剩余时,枚举的因子

找最小的因子,使得

成立。

代码:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>using namespace std;
typedef long long LL;
const int N = 2;
const LL MOD = 1000000007;LL fac[2][505];
int cnt,ct;LL pri[6] = {2, 3, 7, 109, 167, 500000003};
LL num[6] = {4, 2, 1, 2, 1, 1};struct Matrix
{LL m[N][N];
} ;Matrix A;
Matrix I = {1, 0, 0, 1};Matrix multi(Matrix a,Matrix b)
{Matrix c;for(int i=0; i<N; i++){for(int j=0; j<N; j++){c.m[i][j]  =0;for(int k=0; k<N; k++){c.m[i][j] += a.m[i][k] * b.m[k][j];c.m[i][j] %= MOD;}}}return c;
}Matrix power(Matrix A,LL n)
{Matrix ans = I, p = A;while(n){if(n & 1){ans = multi(ans,p);n--;}n >>= 1;p = multi(p,p);}return ans;
}LL quick_mod(LL a,LL b)
{LL ans = 1;a %= MOD;while(b){if(b & 1){ans = ans * a % MOD;b--;}b >>= 1;a = a * a % MOD;}return ans;
}LL Legendre(LL a,LL p)
{LL t = quick_mod(a,(p-1)>>1);if(t == 1) return 1;return -1;
}void dfs(int dept,LL product = 1)
{if(dept == cnt){fac[1][ct++] = product;return;}for(int i=0; i<=num[dept]; i++){dfs(dept+1,product);product *= pri[dept];}
}bool OK(Matrix A,LL n)
{Matrix ans = power(A,n);return ans.m[0][0] == 1 && ans.m[0][1] == 0 &&ans.m[1][0] == 0 && ans.m[1][1] == 1;
}int main()
{fac[0][0] = 1;fac[0][1] = 2;fac[0][2] = 500000003;fac[0][3] = 1000000006;LL a,b,c,d;while(cin>>a>>b>>c>>d){LL t = a * a + 4 * b;A.m[0][0] = a;A.m[0][1] = b;A.m[1][0] = 1;A.m[1][1] = 0;if(Legendre(t,MOD) == 1){for(int i=0; i<4; i++){if(OK(A,fac[0][i])){cout<<fac[0][i]<<endl;break;}}}else{ct = 0;cnt = 6;dfs(0,1);sort(fac[1],fac[1]+ct);for(int i=0;i<ct;i++){if(OK(A,fac[1][i])){cout<<fac[1][i]<<endl;break;}}}}return 0;
}

广义Fibonacci数列找循环节相关推荐

  1. 【打表找循环节】ZOJ - 3939 The Lucky Week

    Step1 Problem: 幸运日指,星期一是1 or 11 or 21号.给出第一个幸运日时间,问第n个幸运日的时间. 例如: 2016 4 11 2 输出: 2016 7 11 数据范围: 时间 ...

  2. 牛客 - 交换(思维+找循环节)

    题目链接:点击查看 题目大意:给出一个数列 n ,要求通过交换使其从小到大排序的最小次数 题目分析:第一反应是求逆序对,把之前做过的题目贴过来结果只过了 10% ,静下心来又读了一下题,发现这个题目要 ...

  3. HDU 4857 Couple doubi(找循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4861 解题报告:桌子上有k个球 ,第i个球的价值wi = 1^i+2^i+...+(p-1)^i (m ...

  4. HDU4611(找循环节)

    题目:Balls Rearrangement #include <iostream> #include <string.h> #include <stdio.h>u ...

  5. (找循环节)Number Sequence

    题目: A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2) ...

  6. luogu 1327 数列排序 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节

    luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...

  7. Fib数模n的循环节

    我们知道Fibonacci数列,现在我们来求一个Fib数模n的循环节的长度. 对于一个正整数n,我们求Fib数模n的循环节的长度的方法如下: (1)把n素因子分解,即 (2)分别计算Fib数模每个的循 ...

  8. HDU 4291 A Short problem 矩阵快速幂 循环节

    题解思路: 构造矩阵,矩阵乘法计算还是t; 需要找循环节;   (注意因为是复合函数,不可以在里面取mod) 暴力跑只有可以找到g(222222224)%1e9==g(0)%1e9; 所以 g(g(n ...

  9. hdu1005 Number Sequence(寻找循环节)

    主题链接: huangjing 题意: 就是给了一个公式,然后求出第n项是多少... 思路: 题目中n的范围实在是太大,所以肯定直接递推肯定会超时,所以想到的是暴力打表,找循环节,可是也不是那么eas ...

最新文章

  1. .Net 程序员走向高端必读书单汇总
  2. threadx 信号量 应用_操作系统及ThreadX简介.ppt
  3. html盒子自动居中,css盒子怎么居中?
  4. mkfs.jffs2 制作镜像问题整理【原创】
  5. java运算符使用总结_Java运算符知识点总结
  6. 创建dataframe_Spark原理与实战(五) Spark核心数据抽象DataFrame
  7. 2个YUV视频 拼接技术
  8. 提升效率Mysql函数(function)|存储过程(procedure)
  9. Unix C编程:共享内存示例 测试代码
  10. c语言文件包含试题,C语言文件练习题含答案
  11. Servlet原理图
  12. MAC帧经过路由器,源目标MAC地址会改变,但是IP的源,目的地址不会改变
  13. 只需三步快速将flac转换mp3格式?
  14. android studio报错Error occurred during initialization of VM Could not reserve enough space
  15. 飞上天和太阳肩并肩中国人这项太阳能开发技术牛大发了
  16. hdu 1789 贪心算法
  17. javascript动态生成按钮并绑定点击事件
  18. 基于微信平台的学生信息管理系统
  19. 半导体器件基础08:MOS管结构和原理(2)
  20. UNIX环境高级编程(屏幕打印和inet_ntoa输出异常问题)

热门文章

  1. Actuator提供的endpoint
  2. TCP/IP的七层负载均衡
  3. 数据仓库分层和元数据管理
  4. SpringBoot-高级-检索-整合SpringDataElasticsearch
  5. css box 等高布局,css实现等高布局有哪些方式
  6. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...
  7. MySQL 复制 - 性能与扩展性的基石:概述及其原理
  8. springMVC---处理模型数据方法 *
  9. Cool!15个创意的 CSS3 文本效果【下篇】
  10. 接口隔离原则(设计模式4)