http://acm.hdu.edu.cn/showproblem.php?pid=5451

题意:给定x    求解

思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = F[n-1] + F[n-2] ;

同时可以看出   和 是 一元二次方程的两根, a  = 1, b = -1 又是之后递推式的系数;

同理这里需要构造出两根为 ,这时 a = 1, b = –10 得 F[n] = 10F[n-1] – F[n-2]; (当然可以直接打表递推出关系式)

如果不管指数,看成是一个   这道题将变成 hdu 2256 Problem of Precision

之后需要知道如何对指数 进行取模简化,问题是具体Mod 多少?

套路是mod (M-1)*(M+1) ,具体证明详见:http://blog.csdn.net/acdreamers/article/details/25616461

到这里指数取模之后,之后跑矩阵快速幂即可;

细节: 前面矩阵快速幂原本只是跑指数-1次,正好把1抵消了;

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define pb push_back
#define MK make_pair
#define A first
#define B second
#define clear0 (0xFFFFFFFE)
#define inf 0x3f3f3f3f
#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
#define bitnum(a) __builtin_popcount(a)
#define lowbit(x) (x&(-x))
#define K(x) ((x)*(x))
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
template<typename T>
void read1(T &m)
{T x = 0,f = 1;char ch = getchar();while(ch <'0' || ch >'9'){ if(ch == '-') f = -1;ch=getchar(); }while(ch >= '0' && ch <= '9'){ x = x*10 + ch - '0';ch = getchar(); }m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{if(a>9) out(a/10);putchar(a%10+'0');
}
inline ll gcd(ll a,ll b){ return b == 0? a: gcd(b,a%b); }
inline ll lcm(ll a,ll b){ return a/gcd(a,b)*b; }
template<class T1, class T2> inline void gmax(T1& a, T2 b){ if(a < b) a = b;}
template<class T1, class T2> inline void gmin(T1& a, T2 b){ if(a > b) a = b;}
int mod;
struct Matrix{int row, col;ll m[10][10];Matrix(int r,int c):row(r),col(c){ memset(m, 0, sizeof(m)); }bool unitMatrix(){if(row != col) return false;for(int i = 0;i < row;i++) //方阵才有单位矩阵;m[i][i] = 1;return true;}Matrix operator *(const Matrix& t){Matrix res(row, t.col);for(int i = 0; i < row; i++)for(int j = 0;j < t.col;j++)for(int k = 0; k < col; k++)res.m[i][j] = (res.m[i][j] + m[i][k]*t.m[k][j])% mod;return res;}void print(){for(int i = 0;i < row; i++){for(int j = 0;j < col; j++)printf("%lld ",m[i][j]);puts("");}}
};Matrix pow(Matrix a, ll n)
{Matrix res(a.row, a.col);res.unitMatrix();while(n){if(n & 1) res = res*a;a = a*a;n >>= 1;}return res;
}
ll POW(ll a,int n, ll mod)
{ll ans = 1;while(n){if(n&1) ans = (ans*a)%mod;a = a*a%mod;n >>= 1;}return ans;
}
int main()
{//freopen("data.txt","r",stdin);//freopen("out.txt","w",stdout);Matrix mat(2,2);mat.m[0][0] = 5, mat.m[0][1] = 12;mat.m[1][0] = 2, mat.m[1][1] = 5;int T, kase = 1;scanf("%d",&T);while(T--){int n;read2(n, mod);ll MOD = 1LL*(mod-1)*(mod+1);MOD = POW(2,n,MOD);Matrix res = pow(mat, MOD);//res.print();Matrix tmp(2,1);tmp.m[0][0] = 5, tmp.m[1][0] = 2;res = res*tmp;printf("Case #%d: %d\n",kase++, (2*res.m[0][0]-1)% mod);}return 0;
}

ps: 这道题循环节较小,直接求解循环节也可以A;

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define pb push_back
#define MK make_pair
#define A first
#define B second
#define clear0 (0xFFFFFFFE)
#define inf 0x3f3f3f3f
#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
#define bitnum(a) __builtin_popcount(a)
#define lowbit(x) (x&(-x))
#define K(x) ((x)*(x))
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
template<typename T>
void read1(T &m)
{T x = 0,f = 1;char ch = getchar();while(ch <'0' || ch >'9'){ if(ch == '-') f = -1;ch=getchar(); }while(ch >= '0' && ch <= '9'){ x = x*10 + ch - '0';ch = getchar(); }m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{if(a>9) out(a/10);putchar(a%10+'0');
}
inline ll gcd(ll a,ll b){ return b == 0? a: gcd(b,a%b); }
template<class T1, class T2> inline void gmax(T1& a, T2 b){ if(a < b) a = b;}
template<class T1, class T2> inline void gmin(T1& a, T2 b){ if(a > b) a = b;}ll pow(ll a,uint n,int mod)
{ll ans = 1;while(n){if(n&1) ans = (ans*a)%mod;a = a*a%mod;n >>= 1;}return ans;
}
const int maxn = 463370;
int F[maxn];
int main()
{//freopen("data.txt","r",stdin);//freopen("out.txt","w",stdout);int T, kase = 1;/*double d1 = 5+2*sqrt(6), d2 = 5 - 2*sqrt(6);rep1(i,1,10){printf("%.5f\n",pow(d1,i)+pow(d2,i));}*/scanf("%d",&T);while(T--){uint x, mod;read2(x,mod);F[0] = 10%mod, F[1] = 98%mod;ll cycle = -1;for(int i = 2; ; i++){F[i] = (10*F[i-1] - F[i-2]+ mod)% mod;if(F[i] == F[1] && F[i-1] == F[0]){cycle = i-1;break;}}int p = pow(2,x, cycle);printf("Case #%d: %d\n",kase++, F[p]-1);}return 0;
}

View Code

转载于:https://www.cnblogs.com/hxer/p/5724436.html

hdu 5451 Best Solver 矩阵循环群+矩阵快速幂相关推荐

  1. HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系快速幂取模)

    题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件. 分析: 满足上述对称条件,那么涂色的种类问题我们可以 ...

  2. 算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数

    题目分析 来源:acwing 分析: 先利用矩阵运算的性质将通项公式变成幂次形式,然后用快速幂的方法求解第 n项. 斐波那契数列的递推公式:f1=f2=1,fn=fn−2+fn−1(n≥3)f_1 = ...

  3. 矩阵乘法和快速幂的一些优化和剪枝

    矩阵相乘 一般会用O(n^3)的方法...配合剪枝[添条件,设门槛...] //O(n^3)算法 #include <iostream> #include <cstdio> # ...

  4. 【HDU - 5187】zhx's contest (快速幂+ 快速乘,模板)

    题干: 2018百度之星复赛晋级名单出炉(增加20%晋级名额)~ zhx's contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

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

    题目链接:点击查看 题目大意:给定x和M,已知 求%M 题目解析:这种公式题在之前已经证明过做法,详见:点击查看 这道题与hdu4565的不同之处就是,这里的n=给的特别的大,而且M不确定,所以没法用 ...

  6. BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...

  7. 矩阵相关操作和矩阵快速幂

    矩阵相关操作和矩阵快速幂 矩阵基本运算以及快速幂模板 POJ - 3070. Fibonacci Hdu - 1757A. Simple Math Problem Codeforces - 185A. ...

  8. python【数据结构与算法】快速幂and矩阵快速幂取模(看不懂你来打我)

    文章目录 1 解释快速幂 2 代码(这里就不考虑指数为小于0的情况了) 3 下面是矩阵快速幂,区别只是底数换成了矩阵 1 解释快速幂 传统的幂运算,是对底数进行连乘,时间复杂度为o(n),例如:2^1 ...

  9. POJ3070矩阵快速幂简单题

    题意:       求斐波那契后四位,n <= 1,000,000,000. 思路:        简单矩阵快速幂,好久没刷矩阵题了,先找个最简单的练练手,总结下矩阵推理过程,其实比较简单,关键 ...

最新文章

  1. js mysql 住宿系统_[源码和文档分享]基于JavaScript和MySQL实现的酒店管理系统
  2. java方法6_6.1 JAVA方法入门
  3. 录入成绩编程平均java_java 学习第二天小练习
  4. 018 微服务之间调用
  5. LVS DR模式搭建、keepalived + LVS
  6. python open写入_Python open读写文件实现脚本
  7. android 布局图片缩放,Android中进行图片缩放显示
  8. 2021-08-31Flink 中的核心概念和基础考察
  9. 算法(第四版)IDEA终极环境配置
  10. 数据库实验——T-SQL编程
  11. android rxbus github,RxBus-实现EventBus之Sticky
  12. json_encode转义中文问题
  13. 一文告诉你 K8s PR (Pull Request) 怎样才能被 merge?
  14. 利普希茨连续(Lipschitz continuous)及其应用
  15. java 配置文件乱码_java程序读取properties配置文件出现中文乱码
  16. pageX与offsetX的区别
  17. BIM模型文件下载——精装修样板间模型
  18. 62套儿童行业响应式Html5儿童慈善机构网站模板儿童公益组织企业官网模板儿童慈善CSS模板下载婴儿树儿童健康食品整站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响
  19. 测试部门KPI考核指标(绩效考核)
  20. 如何查询linux的系统版本

热门文章

  1. Python 搜狗站长平台批量添加域名+批量提交链接 过验证码 IP限制
  2. Apache 2.2 虚拟主机配置(本人推荐的)
  3. iOS开发线程同步技术-锁
  4. .9-Vue源码之AST(5)
  5. RadioButton 自定义控件
  6. oracle随机取数据
  7. Cocos2d学习之路三(使用Zwoptex创建精灵表单和CCAnimate动画)
  8. (转)flash位图缓存cacheAsBitmap
  9. C语言面试题(四)--------------------网上题目
  10. 400 错误,因为url编码问题