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的人品实在是太好了,这馅饼 ...
随机推荐
- Linux 之问题集锦(一)
1. 打开目录时,怎么只显示一个窗口 计算机 -- 编辑 -- 首选项 -- 行为 -- 总是总浏览器窗口中打开 2. linux中添加PATH时出现 Found a swap file by the ...
- 利用memoize缓存到Redis出现多个参数同一个结果
在为后端输出加入Redis缓存的过程中出现的问题. 在我利用Flask-restful架构的后端中,理所当然的利用装饰器marshal_with对我的返回数据进行格式化输出. 举个最简单的例子: fr ...
- jenkins 找不到mvn 命令
错误如下: /data/jenkins/temp/hudson9132559581388971644.sh: line 4: mvn: command not found 方法如下: 1 修改环境变 ...
- codeforces1081G Mergesort Strikes Back【期望dp+脑洞】
首先看这样做的特点,就是分到最后小块里的点合并上去的时候相对顺序不变,所以先加上块内逆序对的期望 合并的时候一定是一边卡住一个大值,另一边跳指针,所以把一个值向右直到有大于它的值位置的一段区间看作一段 ...
- 洛谷P1868 饥饿的奶牛
P1868 饥饿的奶牛 题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你 ...
- Manacher(hdu3068最长回文)
浅谈manacher算法 manacher算法是我在网上无意中找到的,主要是用来求某个字符串的最长回文子串. 不过网上的版本还不太成熟,我就修改了下. 不要被manacher这个名字吓倒了,其实man ...
- 程序员收藏必看系列:深度解析MySQL优化(二)
程序员收藏必看系列:深度解析MySQL优化(一) 性能优化建议 下面会从3个不同方面给出一些优化建议.但请等等,还有一句忠告要先送给你:不要听信你看到的关于优化的“绝对真理”,包括本文所讨论的内容,而 ...
- SAP中对于获取订单的状态
在SAP中对于如何获取订单的状态,提供了至少两个函数,分别是 STATUS_READ 和 STATUS_TEXT_EDIT.下面简单介绍这两个函数 1.STATUS_READ 改函数的实现原理大 ...
- IntelliJ IDEA 安装golang 插件
作者的机器为mac OS 用户首先需要在自己的个人机器上安装好 golang 的环境,详细可以参考 hyperledger fabric 1.0.5 分布式部署 (一)安装 golang 的部分. ...
- JDK动态代理 Proxy InvocationHandler