HDU 5451 Best Solver(fibonacci)
感谢这道题让我复习了一遍线代,还学习了一些奇奇怪怪的数论。
令
二项展开以后根号部分抵消了

显然有

所以要求的答案是

如果n比较小的话,可以直接对二项式快速幂,但是这题n很大
这个问题和矩阵的特征值以及数列递推有奇怪的联系
广义的fibonacci数列的形式如下

写成矩阵形式就是

有一个奇怪的结论:

其中lambda1,lambda2是递推矩阵的特征值,此处只讨论lambda1!=lambda2的情况。
这个奇怪的结论其实很容易证明,

根据以上结果,利用矩阵的数乘和分配律然后归纳就可以完整得到结论
令lambda1=p,lambda2=q,可以求出a和b,答案就在递推的第n项
然后通过找循环节减小n
m是素数时一般的做法:http://blog.csdn.net/ACdreamers/article/details/25616461
费马小定理和欧拉准则不明觉厉。。。
此题所有的m循环节都小,直接暴力,然后记忆化
lambda1!=lambda2,所以A一定可以对角化,而A^n就可以表示为

对应特征值

并且有

所以对A矩阵快速幂以后算出迹减1就是答案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; struct Matrix
{
int e[][];
int* operator[](int p){
return e[p];
}
}; ll Mod;
Matrix operator *(Matrix &A, Matrix &B)
{
Matrix R;
for(int i = ; i < ; i++){
for(int j = ; j < ; j++){
R[i][j] = ;
for(int k = ; k < ; k++){
R[i][j] = (R[i][j] + (ll)A[i][k]*B[k][j]+Mod)%Mod;
}
}
}
return R;
} Matrix Matrix_pow(Matrix A,ll p)
{
Matrix R;
for(int i = ; i < ; i++){
for(int j = ; j < ; j++){
R[i][j] = i==j?:;
}
}
while(p){
if(p&) R = R*A;
A = A*A;
p>>=;
}
return R;
} ll qPow(ll a,ll p,ll mod)
{
ll ret = ;
while(p){
if(p&) ret = (ret*a)%mod;
a = (a*a)%mod;
p >>= ;
}
return ret;
} const int maxm = +;
int r[maxm],f[maxm]; int main()
{
//freopen("in.txt","r",stdin);
int T, kas = ; scanf("%d",&T);
while(T--){
ll x; scanf("%I64d%I64d",&x,&Mod);
if(!r[Mod]){
f[] = ; f[] = ;
for(int i = ; ;i++){
f[i] = (10LL*f[i-]-f[i-]+Mod)%Mod;
if(f[i] == f[] && f[i-] == f[]){ r[Mod] = i-; break; }
}
}
Matrix A;
A[][] = %Mod; A[][] = Mod-; A[][] = ; A[][] = ;
auto ans = Matrix_pow(A,(qPow(,x,r[Mod])+)%r[Mod]);
printf("Case #%d: %d\n",++kas,(ans[][]+ans[][]+Mod-)%Mod);
}
return ;
}
HDU 5451 Best Solver(fibonacci)的更多相关文章
- HDU - 5451 Best Solver(循环节+矩阵快速幂)
Best Solver The so-called best problem solver can easily solve this problem, with his/her childhood ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5775 Bubble Sort(冒泡排序)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- 第2章 数字之魅——斐波那契(Fibonacci)数列
斐波那契(Fibonacci)数列 问题描述 递归算法: package chapter2shuzizhimei.fibonacci; /** * Fibonacci数列递归求解 * @author ...
- 2.裴波那契(Fibonacci)数列
裴波那契(Fibonacci)数列 f(n)= ⎧⎩⎨0,1,f(n−1)+f(n−2),n =0n =1n>1 求裴波那契数列的第n项.(题目来自剑指offer) 1.递归解法,效率很低的解法 ...
- python的生成器(斐波拉契数列(Fibonacci))
代码: 函数版本: #斐波拉契数列(Fibonacci) def fib(max): n=0 a,b=0,1 while n < max: a,b = b,a+b n = n+1 return ...
- HDU 1176 免费馅饼 (动态规划)
HDU 1176 免费馅饼 (动态规划) Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼 ...
随机推荐
- eclipse安装cppcheck
简介: cppcheck 是一个 c 和 c++ 的静态的代码检查分析工具,不用运行程序就可以进行代码的检测. 可以检测一般的内存泄漏和程序编码错误 0.安装 cppcheck 1.57版本,这个版 ...
- Thinkphp3.2 下载文件的方法
今天做一个功能,刚好遇到了一个要下载文件功能的需求,所以把这个基于thinkphp3.2的文件下载功能,描述一下大概的实现方法. 网上有人说用a链接的方法实现,但是这种方法并不安全.所以我们还是用官方 ...
- HDU - 1869 六度分离 Floyd多源最短路
六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...
- JQ 获取ul\ol 下面li的个数
使用 jQuery 获取 ul 下面 li 的个数,那么我们需要遍历我们的ul.如果你的ul有class .id 或两者都没,您可以使用 ul 标签来遍历. //遍历ul 获取li个数 $(" ...
- python + requests实现的接口自动化框架详细教程
前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自 ...
- 3damx平滑组注意事项
需要在Editable Poly->面级别,选中(需要平滑的)面,然后去点平滑组或自动平滑 如果出现下图的情况,说明可能是有多余点,点没缝合 max中确认,确实是点没缝合导致
- cogs 721. [SDOI2007] 线性方程组
721. [SDOI2007] 线性方程组 ★★ 输入文件:gaess.in 输出文件:gaess.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 已知 n 元 ...
- java获取本机ip的方法
直接上代码: public class LocalIPUtil { public static String getLocalIp(HttpServletRequest request){ Strin ...
- vue -- key的特殊作用
v-for渲染的列表的结构采用“就地复用”的策略,也就说当数据重新排列数据时,会复用已在页面渲染好的元素,不会移动 DOM 元素来匹配数据项的顺序,这种模式是高效的,改变现有位置的结构的数据即可 eg ...
- c# Array或List有个很实用的ForEach方法,可以直接传入一个方法对集合中元素操作
using System; using System.Collections.Generic; namespace demo { class Program { static void Main(st ...