感谢这道题让我复习了一遍线代,还学习了一些奇奇怪怪的数论。

二项展开以后根号部分抵消了

显然有

所以要求的答案是

如果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)的更多相关文章

  1. HDU - 5451 Best Solver(循环节+矩阵快速幂)

    Best Solver The so-called best problem solver can easily solve this problem, with his/her childhood ...

  2. HDU 5938 Four Operations(四则运算)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  3. HDU 5775 Bubble Sort(冒泡排序)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  4. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  5. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

  6. 第2章 数字之魅——斐波那契(Fibonacci)数列

    斐波那契(Fibonacci)数列 问题描述 递归算法: package chapter2shuzizhimei.fibonacci; /** * Fibonacci数列递归求解 * @author ...

  7. 2.裴波那契(Fibonacci)数列

    裴波那契(Fibonacci)数列 f(n)= ⎧⎩⎨0,1,f(n−1)+f(n−2),n =0n =1n>1 求裴波那契数列的第n项.(题目来自剑指offer) 1.递归解法,效率很低的解法 ...

  8. python的生成器(斐波拉契数列(Fibonacci))

    代码: 函数版本: #斐波拉契数列(Fibonacci) def fib(max): n=0 a,b=0,1 while n < max: a,b = b,a+b n = n+1 return ...

  9. HDU 1176 免费馅饼 (动态规划)

    HDU 1176 免费馅饼 (动态规划) Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼 ...

随机推荐

  1. eclipse安装cppcheck

     简介: cppcheck 是一个 c 和 c++ 的静态的代码检查分析工具,不用运行程序就可以进行代码的检测. 可以检测一般的内存泄漏和程序编码错误 0.安装 cppcheck 1.57版本,这个版 ...

  2. Thinkphp3.2 下载文件的方法

    今天做一个功能,刚好遇到了一个要下载文件功能的需求,所以把这个基于thinkphp3.2的文件下载功能,描述一下大概的实现方法. 网上有人说用a链接的方法实现,但是这种方法并不安全.所以我们还是用官方 ...

  3. HDU - 1869 六度分离 Floyd多源最短路

    六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...

  4. JQ 获取ul\ol 下面li的个数

    使用 jQuery 获取 ul 下面 li 的个数,那么我们需要遍历我们的ul.如果你的ul有class .id 或两者都没,您可以使用 ul 标签来遍历. //遍历ul 获取li个数 $(" ...

  5. python + requests实现的接口自动化框架详细教程

    前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自 ...

  6. 3damx平滑组注意事项

    需要在Editable Poly->面级别,选中(需要平滑的)面,然后去点平滑组或自动平滑 如果出现下图的情况,说明可能是有多余点,点没缝合 max中确认,确实是点没缝合导致

  7. cogs 721. [SDOI2007] 线性方程组

    721. [SDOI2007] 线性方程组 ★★   输入文件:gaess.in   输出文件:gaess.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 已知 n 元 ...

  8. java获取本机ip的方法

    直接上代码: public class LocalIPUtil { public static String getLocalIp(HttpServletRequest request){ Strin ...

  9. vue -- key的特殊作用

    v-for渲染的列表的结构采用“就地复用”的策略,也就说当数据重新排列数据时,会复用已在页面渲染好的元素,不会移动 DOM 元素来匹配数据项的顺序,这种模式是高效的,改变现有位置的结构的数据即可 eg ...

  10. c# Array或List有个很实用的ForEach方法,可以直接传入一个方法对集合中元素操作

    using System; using System.Collections.Generic; namespace demo { class Program { static void Main(st ...