hdu6470 Count 矩阵快速幂

hdu6470

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 6, mod = 123456789;
 5
 6 struct MAT {
 7     ll a[maxn][maxn];
 8     MAT(){ memset(a,0,sizeof(a)); }
 9     MAT operator*(MAT p) {
10         MAT res;
11         for (int i = 0; i < maxn; i++)
12             for (int j = 0; j < maxn; j++)
13                 for(int k = 0; k < maxn; k++)
14                     res.a[i][j] = (res.a[i][j]+a[i][k]*p.a[k][j])%mod;
15         return res;
16     }
17 };
18 MAT mat_qpow(MAT A, ll b) {
19     MAT res;
20     res.a[0][0] = 1;
21     while(b) {
22         if(b&1) res = res*A;
23         A = A*A;
24         b >>= 1;
25     }
26     return res;
27 }
28 void init(MAT& A, MAT& B) {
29     A.a[0][0]=1, A.a[0][1]=2, A.a[0][2]=1, A.a[0][3]=0, A.a[0][4]=0, A.a[0][5]=0;
30     A.a[1][0]=1, A.a[1][1]=0, A.a[1][2]=0, A.a[1][3]=0, A.a[1][4]=0, A.a[1][5]=0;
31     A.a[2][0]=0, A.a[2][1]=0, A.a[2][2]=1, A.a[2][3]=3, A.a[2][4]=3, A.a[2][5]=1;
32     A.a[3][0]=0, A.a[3][1]=0, A.a[3][2]=0, A.a[3][3]=1, A.a[3][4]=2, A.a[3][5]=1;
33     A.a[4][0]=0, A.a[4][1]=0, A.a[4][2]=0, A.a[4][3]=0, A.a[4][4]=1, A.a[4][5]=1;
34     A.a[5][0]=0, A.a[5][1]=0, A.a[5][2]=0, A.a[5][3]=0, A.a[5][4]=0, A.a[5][5]=1;
35
36     B.a[0][0]=2, B.a[1][0]=1, B.a[2][0]=27, B.a[3][0]=9, B.a[4][0]=3, B.a[5][0]=1;
37 }
38
39 int main() {
40     int t; scanf("%d",&t);
41     while(t--) {
42         ll n; scanf("%lld",&n);
43         MAT A; MAT ans;
44         init(A,ans);
45         ans = mat_qpow(A,n-2)*ans;
46         printf("%lld\n",ans.a[0][0]);
47     }
48     return 0;
49 }

原文地址:https://www.cnblogs.com/wstong/p/11743114.html

时间: 2024-10-25 21:39:12

hdu6470 Count 矩阵快速幂的相关文章

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

Count Numbers(矩阵快速幂)

Count Numbers 时间限制: 8 Sec  内存限制: 128 MB提交: 43  解决: 19[提交] [状态] [讨论版] [命题人:admin] 题目描述 Now Alice wants to sum up all integers whose digit sum is exactly ab .However we all know the number of this kind of integers are unlimited. So she decides to sum u

LA 7361 Immortal Porpoises (矩阵快速幂)

题意:求Fibonacci的第 n 项. 析:矩阵快速幂,如果不懂请看http://www.cnblogs.com/dwtfukgv/articles/5595078.html 是不是很好懂呢. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <

CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)

题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\(p-1\),那么\(a\)就是\(p\)的一个原根 离散对数 对于素数\(p\),以及\(p\)的一个原根\(g\),定义\(y\)为\(x\)的离散对数,当且仅当\(g^y\equiv x\pmod{p}\),记\(y\)为\(ind_g x\).不难发现原数和离散对数可以一一对应.也不难发现离

Codeforces1106F 【BSGS】【矩阵快速幂】【exgcd】

首先矩阵快速幂可以算出来第k项的指数,然后可以利用原根的性质,用bsgs和exgcd把答案解出来 #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N = 1e2 + 10; const ll Mod = 998244353; ll add(ll a, ll b, ll mod = Mod) { return (a += b) >= mod ? a - mod : a; } ll sub

CF1106F Lunar New Year and a Recursive Sequence——矩阵快速幂&amp;&amp;bsgs

题意 设 $$f_i = \left\{\begin{matrix}1 , \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  i < k\\ \prod_{j=1}^k f_{i-j}^{b_j} \ mod \ p, \ \ \ \ \ i > k\end{matrix}\right.$$ 求 $f_k$($1 \leq f_k < p$),使得 $f_m = n$.($1 \leq k\leq 100$) 分析 $f_n$ 可以表示

状压dp,区间dp,矩阵快速幂

DP 首先先回忆一下dp,dp叫做记忆化搜索,是一种可以把暴力搜索中重复的部分重复利用,从而到达减小复杂度的目的.比如最应该熟悉的背包模型,如果你把选择的过程看成一步一步的,那么在这么多的搜索路径中一定有着很多很多的重复部分,dp就是一种把重复的部分加以利用的方法.相信大家都已经在以前的练习中已经明白了dp是什么样的思路了,接下来的两种dp会在大家已经了解经典的背包dp等模型下展开. 状态压缩dp: 首先先讲一个状压dp最最经典的模型,求哈密尔顿路径问题,也叫做旅行商问题:给你一张图,你要在每个

矩阵快速幂刷题系列

来源自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

HDU 1757 A Simple Math Problem (矩阵快速幂)

[题目链接]:click here~~ [题目大意]: If x < 10 f(x) = x. If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10); 问f(k)%m的值. [思路]:矩阵快速幂,具体思路看代码吧,注意一些细节. 代码: #include<bits/stdc++.h> using namespace std; typedef long long LL; const