hdu1005 矩阵

 1 //Accepted hdu1005 0MS 248K
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <queue>
 6 #include <cmath>
 7 #include <algorithm>
 8 using namespace std;
 9 /**
10   * This is a documentation comment block
11   * 如果有一天你坚持不下去了,就想想你为什么走到这儿!
12   * @authr songt
13   */
14 const int imax_n = 5;
15 struct matrix
16 {
17     int n,m;
18     int a[imax_n][imax_n];
19     matrix mult(matrix x,int p)
20     {
21         matrix temp;
22         if (m==x.n)
23         {
24             for (int i=1;i<=n;i++)
25             {
26                 for (int j=1;j<=x.m;j++)
27                 {
28                     temp.a[i][j]=0;
29                     for (int k=1;k<=m;k++)
30                     temp.a[i][j]=(temp.a[i][j]+a[i][k]%p*(x.a[k][j]%p)%p)%p;
31                 }
32             }
33             temp.n=n;
34             temp.m=x.m;
35         }
36         return temp;
37     }
38     /*
39     matrix exp(int n,int p)
40     {
41         if (n!=m) return (*this);
42         matrix temp=(*this);
43         matrix res;
44         res.n=res.m=n;
45         for (int i=1;i<=n;i++)
46         for (int j=1;j<=n;j++)
47         res.a[i][j]=1;
48         while (n)
49         {
50             if (n&1) res=res.mult(temp,p);
51             temp=temp.mult(temp,p);
52             n>>=1;
53         }
54         return res;
55     }*/
56     matrix exp(int n,int p)
57     {
58         matrix temp;
59         if (n==1) return (*this);
60         temp=exp(n/2,p);
61         temp=temp.mult(temp,p);
62         if (n%2==1) temp=temp.mult((*this),p);
63         return temp;
64     }
65 };
66 int a,b,n;
67 void slove()
68 {
69     if (n==1 || n==2)
70     {
71         printf("1\n");
72         return ;
73     }
74     matrix temp;
75     temp.n=2;
76     temp.m=2;
77     temp.a[1][1]=a;
78     temp.a[1][2]=1;
79     temp.a[2][1]=b;
80     temp.a[2][2]=0;
81     temp=temp.exp(n-2,7);
82     matrix ans;
83     ans.n=1;
84     ans.m=2;
85     ans.a[1][1]=ans.a[1][2]=1;
86     ans=ans.mult(temp,7);
87     int res=ans.a[1][1];
88     printf("%d\n",res);
89 }
90 int main()
91 {
92     while (scanf("%d%d%d",&a,&b,&n) && !(a==0 && b==0 && n==0))
93     {
94         slove();
95     }
96     return 0;
97 }

时间: 2024-12-18 05:21:20

hdu1005 矩阵的相关文章

矩阵快速幂(入门) 学习笔记hdu1005, hdu1575, hdu1757

矩阵快速幂是基于普通的快速幂的一种扩展,如果不知道的快速幂的请参见http://www.cnblogs.com/Howe-Young/p/4097277.html.二进制这个东西太神奇了,好多优秀的算法都跟他有关系,这里所说的矩阵快速幂就是把原来普通快速幂的数换成了矩阵而已,只不过重载了一下运算符*就可以了,也就是矩阵的乘法,  当然也可以写成函数,标题中的这三个题都是关于矩阵快速幂的基础题.拿来练习练习熟悉矩阵快速幂,然后再做比较难点的,其实矩阵快速幂比较难的是构造矩阵.下面还是那题目直接说话

HDU1005 找规律 or 循环点 or 矩阵快速幂

http://acm.hdu.edu.cn/showproblem.php?pid=1005 1.一开始就注意到了n的数据范围 <=100 000 000,但是还是用普通的循环做的,自然TLE了,然后朴素打表,= =运行不了,(怎么可能能把数组开到那么大).再然后就想到了寻找下一个1 1 连续在一起的,那就能开始下一轮循环了. 但是,各种WA--(将数组开大一点,寻找到a[ i ] = a[ i -1 ] ==1 即跳出),这个AC代码将102改成100,150,200都可以,但是108,49

数论基础——循环节和矩阵快速幂的运用

首先我们来看一道基础题: 题目链接:HDU1005 Number Sequence 题目描述: Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 147421    Accepted Submission(s): 35814 Problem Description A number sequence is

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

*C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)

最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉.可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分: 一.[拖动]   拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的.以下是核心代码(及效果图): 1 /// <summary> 2 /// 这里TitleBar代指最

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr

51nod 1137 矩阵乘法

基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第二个矩阵的行相同 // 然后ans[i][j] += a[i][k] * b[k][j]; #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 150; int n; ll a[ma

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6155 Subsequence Count 矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 题意: 题解来自:http://www.cnblogs.com/iRedBean/p/7398272.html 先考虑dp求01串的不同子序列的个数. dp[i][j]表示用前i个字符组成的以j为结尾的01串个数. 如果第i个字符为0,则dp[i][0] = dp[i-1][1] + dp[i-1][0] + 1,dp[i][1] = dp[i-1][1] 如果第i个字符为1,则dp[i][1

POJ3233 构造子矩阵+矩阵快速幂

题意:给你矩阵A,求S=A+A^1+A^2+...+A^n sol:直接把每一项解出来显然是不行的,也没必要. 我们可以YY一个矩阵: 其中1表示单位矩阵 然后容易得到: 可以看出这个分块矩阵的左下角那块就可以得到要求的解S 我们取这一块,再减去一个单位矩阵1即可. 为了保持右下角一直是1,所以右上的位置必须是0,由于需要不断移位,所以1是必要的,A是必要的,所以第一列保证移位, 第二列保证保留1,因此我们能成功构造出.... 这个题还可以根据等比矩阵的性质来进行求解...后面补(x