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的人品实在是太好了,这馅饼 ...
随机推荐
- 数组,for语句(补10.11)
1.数组定义:一系列通数据类型的数据集合. 2.数组赋值的两种方法: 先定义后赋值:(赋值从0开始) var aa = new Arrey(); aa[0] = 1; aa[1] = 2; 定义并赋值 ...
- 从网络架构方面简析循环神经网络RNN
一.前言 1.1 诞生原因 在普通的前馈神经网络(如多层感知机MLP,卷积神经网络CNN)中,每次的输入都是独立的,即网络的输出依赖且仅依赖于当前输入,与过去一段时间内网络的输出无关.但是在现实生活中 ...
- SEO优化之——hreflang(多语言网站优化)
用法格式 <link rel="alternate" href="URL" hreflang="zh-cn"> // href ...
- 杭电1002_A + B Problem II
这是该题的链接http://acm.hdu.edu.cn/showproblem.php?pid=1002 具体的题的内容就不过多描述了,想必你已经知道了,当我看完这道题后就知道咋写了,可是这道题从开 ...
- 渲染路径-Unity5 的新旧推迟渲染Deferred Lighting Rendering Path
Unity5 的新旧延迟渲染Deferred Lighting Rendering Path unity5 的render path ,比4的区别就是使用的新的deferred rendering,之 ...
- 77%的Linux运维都不懂的内核问题
前言 之前在实习时,听了 OOM 的分享之后,就对 Linux 内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟,所以经过一个一段时间的积累,对内核内存有一定了解之后, ...
- mac 修改mysql 密码, navicat 连接失败原因
1.cd /usr/local/mysql/bin/ 2.sudo su输入之后会要求输入你的计算机密码,输入的时候是什么都不显示的,输完后回车 3. ./mysqld_safe --skip-gra ...
- HTML+CSS注意点
1. 对于中文网页,需要在header中使用<meta charset="utf-8">声明编码,否则会出现乱码. 2. 属性 属性 描述 class 为html元素定 ...
- 更新常用的js工具函数
在手机调试时打印代码<script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></ ...
- c#字符串字面量
分为两种: 1 常规字符串字面量 2逐字字面量字符串:以@字符为前缀.注意:注意逐字字面量唯一例外的是相邻的双引号组,它们被解释为单个双引号字符.