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的人品实在是太好了,这馅饼 ...
随机推荐
- VS13+OPCV2.4.11
转载:http://blog.csdn.net/a934270082/article/details/50843266?locationNum=3&fps=1 1. 配置系统环境变量:计算机 ...
- 关于JSP页面中的pageEncoding和contentType两种属性的区别
转自:http://blog.csdn.net/dragon4s/article/details/6604624 JSP指令标签中<%@ page contentType="text/ ...
- POJ - 2955 Brackets括号匹配(区间dp)
Brackets We give the following inductive definition of a “regular brackets” sequence: the empty sequ ...
- MVC+Linq+EF笔记
using (DataContext ctx = new DataContext()) { /*foreach (var item in ctx.employees) { ViewData[" ...
- Elasticsearch Query DSL查询入门
本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...
- glassfish 自定义 jaas realm
https://www.oschina.net/translate/custom-jaas-realm-for-glassfish-3
- mac 安装cocoapods
按主command+空格 输入ter 就能看到终端 左键单机(直接点回车键也可以)打开即可 需要先安装ruby环境 安装rvm curl -sSL https://get.rvm.io | bash ...
- MyIfmHttpClient
package com.yd.ifm.client.caller.util.http; import java.util.Map; import com.yd.ifm.client.caller.mo ...
- 转Keil 中使用 STM32F4xx 硬件浮点单元
Keil 中使用 STM32F4xx 硬件浮点单元一.前言有工程师反应说 Keil 下无法使用 STM32F4xx 硬件浮点单元, 导致当运算浮点时运算时间过长,还有 一些人反应不知如何使用芯片芯片内 ...
- F. Clique in the Divisibility Graph DP
http://codeforces.com/contest/566/problem/F F. Clique in the Divisibility Graph time limit per test ...