hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
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 = ,f = ;char ch = getchar();
- while(ch <'' || ch >''){ if(ch == '-') f = -;ch=getchar(); }
- while(ch >= '' && ch <= ''){ x = x* + ch - '';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>) out(a/);
- putchar(a%+'');
- }
- inline ll gcd(ll a,ll b){ return b == ? 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[][];
- Matrix(int r,int c):row(r),col(c){ memset(m, , sizeof(m)); }
- bool unitMatrix(){
- if(row != col) return false;
- for(int i = ;i < row;i++) //方阵才有单位矩阵;
- m[i][i] = ;
- return true;
- }
- Matrix operator *(const Matrix& t){
- Matrix res(row, t.col);
- for(int i = ; i < row; i++)
- for(int j = ;j < t.col;j++)
- for(int k = ; 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 = ;i < row; i++){
- for(int j = ;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 & ) res = res*a;
- a = a*a;
- n >>= ;
- }
- return res;
- }
- ll POW(ll a,int n, ll mod)
- {
- ll ans = ;
- while(n){
- if(n&) ans = (ans*a)%mod;
- a = a*a%mod;
- n >>= ;
- }
- return ans;
- }
- int main()
- {
- //freopen("data.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- Matrix mat(,);
- mat.m[][] = , mat.m[][] = ;
- mat.m[][] = , mat.m[][] = ;
- int T, kase = ;
- scanf("%d",&T);
- while(T--){
- int n;
- read2(n, mod);
- ll MOD = 1LL*(mod-)*(mod+);
- MOD = POW(,n,MOD);
- Matrix res = pow(mat, MOD);
- //res.print();
- Matrix tmp(,);
- tmp.m[][] = , tmp.m[][] = ;
- res = res*tmp;
- printf("Case #%d: %d\n",kase++, (*res.m[][]-)% mod);
- }
- return ;
- }
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 = ,f = ;char ch = getchar();
- while(ch <'' || ch >''){ if(ch == '-') f = -;ch=getchar(); }
- while(ch >= '' && ch <= ''){ x = x* + ch - '';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>) out(a/);
- putchar(a%+'');
- }
- inline ll gcd(ll a,ll b){ return b == ? 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 = ;
- while(n){
- if(n&) ans = (ans*a)%mod;
- a = a*a%mod;
- n >>= ;
- }
- return ans;
- }
- const int maxn = ;
- int F[maxn];
- int main()
- {
- //freopen("data.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- int T, kase = ;
- /*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[] = %mod, F[] = %mod;
- ll cycle = -;
- for(int i = ; ; i++){
- F[i] = (*F[i-] - F[i-]+ mod)% mod;
- if(F[i] == F[] && F[i-] == F[]){
- cycle = i-;
- break;
- }
- }
- int p = pow(,x, cycle);
- printf("Case #%d: %d\n",kase++, F[p]-);
- }
- return ;
- }
hdu 5451 Best Solver 矩阵循环群+矩阵快速幂的更多相关文章
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...
- Luogu T7152 细胞(递推,矩阵乘法,快速幂)
Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...
- Hdu 5451 Best Solver (2015 ACM/ICPC Asia Regional Shenyang Online) 暴力找循环节 + 递推
题目链接: Hdu 5451 Best Solver 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 解题思路: x的取值为[1, 232],看到这个指数,我的心情是异常崩 ...
- ACM学习历程—HDU 5451 Best Solver(Fibonacci数列 && 快速幂)(2015沈阳网赛1002题)
Problem Description The so-called best problem solver can easily solve this problem, with his/her ch ...
- HDU 5451 Best Solver 数论 快速幂 2015沈阳icpc
Best Solver Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Tota ...
- HDU1575Tr A(矩阵相乘与快速幂)
Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ...
- bzoj 3240 矩阵乘法+十进制快速幂
首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...
- poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7825 Accepted: 3068 Descri ...
随机推荐
- android studio1.3安装终于成功
本人机器是win7 32位旗舰版,4G内存.以前使用eclipse adt bundle开发Android程序感觉非常方便,但随着google对andriod studio支持力度加大,转向studi ...
- Android的Task和Activity相关
android:allowTaskReparenting 用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移 ...
- IIs站点的建立
控制面板——管理工具——Internet信息服务管理器 首先应设置的文件权限:System 和 admin 程序池:4.0 编辑权限:iis apppool\名称 身份验证:匿名身份——应用程序池标识
- hdu-5686 Problem B(斐波那契数列)
题目链接: Problem B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu 4144 状态压缩dp
#include<map> #include<set> #include<cmath> #include<queue> #include<cstd ...
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- 导出用户列表到Excel的几种方法
最近客户在咨询着怎么把SharePoint上面的用户列表给到出Excel,查看了一下,SharePoint并没有提供直接可用的导出功能(虽然都是List,但就是不让你导出...) 网上搜索了一下,方法 ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(一)(转)
由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最近想给团队成员做一个系统的解说,让大家都可以学习一下ASP. ...
- SQL Server 事务处理 回滚事务
--创建表: GO CREATE TABLE [dbo].[tb1]( [Id] [int] NOT NULL, [c1] [nvarchar](50) NULL, [c2] [datetime] N ...
- C#创建Windows服务入门图解(VS2010)
C#创建Windows服务入门图解(VS2010) Windows服务大家都知道,比如Audio.Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的.所 ...