
ACM-矩阵快速幂
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
hdu 5015(矩阵快速幂)
题意:有一个矩阵横排第一行初始是0,233,2333,23333...,然后给出计算公式a[i][j] = a[i - 1][j] + a[i][j - 1],然后给出了n和m和第一列的各值要求计算a[n][m]的值。题解:n #include #include #define ll long longconst int N = 15;const int MOD = 100原创 2015-03-19 21:07:46 · 1170 阅读 · 0 评论 -
zoj 3960(矩阵快速幂)
题意:有n个人坐成一排,每个人从1…m中选出一个数字,只有一个规则,如果相邻两个人选出的数字相同,这个数字必须大于等于k(k <= m),问n个人选数字一共有多少种方法。 题解:需要递推,定义一个数组f[i]表示要放第i个数字大于等于k的方法数,g[i]表示要放第i个数字小于k的方法,结果当然就是f[n] + g[n]。 f[i] = f[i - 1] * (m - k) + g[i - 1]原创 2015-05-30 10:34:27 · 829 阅读 · 0 评论 -
hdu 2855(矩阵快速幂)
题意:计算公式 题解:想推出矩阵相乘的形式,想了很久也想不出,然后看别人的题解有一个高中就学过的式子: (1 + x) ^ n = Cn0x^n+Cn1x^(n-1)+Cn2x^(n-2)+Cn3x^(n-3)+····+Cnn 然后想到斐波那契矩阵是{1,1,1,0},1看做一个单位阵{1,0,1,0},就会做了。。。 #include <stdio.h>#include <stri原创 2015-05-31 22:11:24 · 672 阅读 · 0 评论 -
hdu 4291(矩阵快速幂 + 循环节)
题意:求s s = g(g(g(n))) mod 1000000007 其中g(n) g(n) = 3g(n - 1) + g(n - 2) g(1) = 1 g(0) = 0 题解:普通的矩阵快速幂会超时,看到别人的题解是需要计算循环节得到小的MOD从而减小计算量。1000000007太大,需要计算更小的一个循环节,新技能get。#include <stdio.h>#include原创 2015-05-29 21:06:35 · 919 阅读 · 0 评论 -
fzu 1692(矩阵快速幂)
题意:有n个小朋友围一圈,初始每个人有ai个苹果,每轮过去,每个小朋友可以得到 ( L*A (i+n-1)%n+R*A (i+1)%n ) 个苹果,问m轮过后,每个小朋友有多少个苹果。 题解:普通的矩阵快速幂会超时,需要把矩阵乘法的三层循环变为两层,而且好像L和R位置应该是反的结果才正确。#include <stdio.h>#include <string.h>const int N = 10原创 2015-05-30 19:00:17 · 581 阅读 · 0 评论 -
uva 12470(矩阵快速幂)
题意:公式f(n) = f(n - 1) + f(n - 2) + f(n - 3),给出n,f(1) = 0,f(2) = 1, f(3) = 2,要求得出f(n)。 题解:普通的矩阵快速幂模板题。#include <stdio.h>#include <string.h>const int MOD = 1000000009;struct Mat { long long g[3][3原创 2015-06-01 20:33:42 · 908 阅读 · 0 评论 -
hdu 3658(矩阵快速幂)
题意:一个长度为m的字符串需要填充,填充字母必须是’A’ ~ ‘Z’,’a’ ~ ‘z’,要求字符串相邻字符的ascii值的差值≤32,且必须至少存在一个相邻字符差值等于32。问有多少种填充方式。 题解:直接构造至少存在一个相邻字符差值等于32的不好做,可以逆着想,先求出差值>=32的所有情况,再求出差值<32的所有情况,两个结果相减就是解。#include <stdio.h>#include原创 2015-06-01 20:41:29 · 806 阅读 · 0 评论 -
hdu 3117(矩阵快速幂)
题意:求斐波那契序列的第n个数。如果超过8位,只输出前4位和后4位。 题解:后4位比较好办,直接mod10000就可以了,前4位不知道怎么求,网上看到一个人写的很详细易懂,需要用到斐波那契通项公式,详细见→传送门#include <stdio.h>#include <math.h>#include <string.h>struct Mat { long long g[2][2];}原创 2015-06-02 22:34:42 · 674 阅读 · 0 评论 -
lightOj 1132(矩阵快速幂)
题意:求式子(1^K + 2^K + 3^K + … + N^K) % 2^32,给出N和K,1<=n <=10^15, 1 <= k <= 50。 题解:可以看到N很大,数组肯定开不下,只能从K入手,让f(x + 1) = f(x) + (x + 1) ^k,x从1开始到n-1,然后看到(x + 1)^k是一个二项展开式,针对这个展开式构造一个包含C(n, m)的矩阵。 结果是两个矩阵相乘n-原创 2015-06-02 22:48:16 · 876 阅读 · 0 评论 -
hdu 2842(矩阵快速幂+递推)
题意:一个中国环的游戏,规则是一个木棒上有n个环,第一个环是可以随意放上或拆下的,剩下的环x如果想放上或拆下必须前一个环x-1是放上的且前x-2个环全部是拆下的,问n个环最少多少次操作可以全部拆掉。 题解:需要进行递推,首先第一步肯定是要拆第n个环保证操作次数最少,因为后面的环是否存在对前面的环不造成影响,而先拆前面的如果要拆后面的环还是要把前面的放上,f(n)表示拆掉前n个环需要的最少操作次数,原创 2015-06-04 17:38:38 · 940 阅读 · 0 评论 -
hdu 2254(矩阵快速幂+分治)
题解:首先要城市要离散化,根据离散数学中可达矩阵的定义,给出一个有向图的邻接矩阵A,res = (A + E)^n表示这个矩阵n步后的可达情况,res[i][j]表示点i经过n步后到点j的方法数,那么给出了t1至t2后从v1到v2的方法数,就是要计算A^t1 + A^(t1 + 1) + … + A^(t2) 用了分治的思想计算,之前有写过模板http://blog.youkuaiyun.com/hyczms原创 2015-06-04 19:55:18 · 1018 阅读 · 0 评论 -
poj 2778(ac自动机+矩阵快速幂)
题意:给出n个字符串(由字母A C G T组成),然后问一个长度为m的字符串(由字母A C G T组成)中不出现n个字符串中任意一个的种类是多少。 题解:因为m的范围是20000000000,要用到矩阵快速幂加速运算,邻接矩阵mat[i][j]表示从节点i到节点j走一步有多少种走法,那么mat[i][j]^n是n步可达矩阵,也就是从节点i到节点j走n步有多少种走法,这个步骤用矩阵快速幂,可以根据t原创 2015-10-06 00:32:19 · 790 阅读 · 0 评论 -
uva 10870(矩阵快速幂)
题意:计算f(n) f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + … + ad f(n - d), for n > d. 题解:斐波那契的变形,把2个扩大成d个,然后加了a1…ad的参数,构造矩阵直接矩阵快速幂计算。#include <stdio.h>#include <string.h>const int N = 20;struct M原创 2015-05-29 22:44:12 · 702 阅读 · 0 评论 -
hdu 3306(矩阵快速幂)
题意:f(0) = 1, f(1) = 1, f(n) = x*f(n - 1) + y*f(n - 2),要计算输出Sn = f(0)^2 + f(1)^2 + … + f(n)^2。 题解:构造矩阵 其中 f(n)*f(n) = x^2*f(n-1)^2 + y^2*f(n-2)^2 + 2xy*f(n-1)*f(n-2)。#include <stdio.h>#include <strin原创 2015-05-28 23:15:33 · 587 阅读 · 0 评论 -
hdu 4565(矩阵快速幂)
题意:给出a,b,n,m按如下公式计算输出Sn 题解:和之前做过的一题很像,推导公式如下 (a+根号b)^n = xn + yn×根号b –> (xn-1 + yn-1×根号b)×(a+根号b) = (a*xn-1 + b*yn-1) + (xn-1 + a×yn-1)×根号b然后写成矩阵形式后(a-根号b)^n = xn - yn×根号bxn+yn×根号b = xn+yn×根号b +原创 2015-05-28 23:08:51 · 618 阅读 · 0 评论 -
hdu 5187(快速幂)
题意:给出一个数字n,然后需要把[1,n]重新排列,规则是1:a1..ai是单调递减或者单调递增的。2:ai..an是单调递减或者单调递增的。问两种条件都满足的序列有多少种,答案需要mod p。题解:先暴力看看结果,可以找到规律是2^n - 2,可以用快速幂取模来解,但是因为数据范围是10^18,两数相乘就已经爆掉了,所以要再写一个函数,乘法换加法。#include原创 2015-03-15 12:35:29 · 720 阅读 · 0 评论 -
poj 3070(矩阵快速幂)
题意:一个斐波那契序列f,给出n,问fn是多少。题解:因为题目中还给出了一个矩阵公式,用矩阵快速幂的方式解答。#include #include const int MOD = 10000;struct Matrix { int a[2][2];}f, ori;int n;void init() { ori.a[0][0] = 1; ori.a[0][1] = 1;原创 2015-03-24 19:31:00 · 461 阅读 · 0 评论 -
hdu 1575(矩阵快速幂)
题解:矩阵快速幂模板题。#include <stdio.h>#include <string.h>const int N = 10;struct Mat { int g[N][N];}res, ori;int n, k;Mat multiply(Mat x, Mat y) { Mat temp; memset(temp.g, 0, sizeof(temp.g));原创 2015-05-28 00:02:37 · 551 阅读 · 0 评论 -
hdu 2604(矩阵快速幂)
题意:f和m两种字母,给出l表示有2^l个由f和m组成长度为l的字符串,如果这些字符串内包含fmf或fff子串的是一种特殊字符串,给出l问不是特殊字符串的数量是多少。 题解:先暴力把前几个l的答案跑了一下,发现有个规律f(n) = f(n - 1) + f(n - 3) + f(n - 4),试着用这个公式写了矩阵快速幂交上去过了,但后来发现这个规律是有原因的,如果以m为最后一个字符的答案有f(n原创 2015-05-28 00:17:28 · 634 阅读 · 0 评论 -
hdu 2256(矩阵快速幂)
题意:求(根号2 + 根号3)^2n模1024。 题解:浮点数无法精确模1024得到答案,下图是推导过程 根据推导过程得出解很简单了。#include <stdio.h>#include <math.h>#include <string.h>const int N = 3;struct Mat { int g[N][N];}ori, res;int n;Mat multi原创 2015-05-27 23:49:30 · 544 阅读 · 0 评论 -
fzu 1683(矩阵快速幂)
题解:构造出矩阵,每次只保留前三个数字,结果矩阵多添加一维存累加和。#include <stdio.h>#include <string.h>const int N = 5;struct Mat { int g[N][N];}ori, res;int n, ans;Mat multiply(Mat x, Mat y) { Mat temp; memset(temp.原创 2015-05-27 23:53:36 · 622 阅读 · 0 评论 -
hdu 1757(矩阵快速幂)
题意:公式如下 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); And ai(0<=i<=9) can only be 0 or 1 . 题解:构造矩阵,第一列放a0到a9,然后第二列第一行放1,第三列第二行放1…第10列第9行放1,为了原创 2015-05-27 23:56:23 · 578 阅读 · 0 评论 -
codeforces 185a(矩阵快速幂)
题意:三角形变化过程如下图 问正着的三角形的个数,n=1时1个,n=2时3个,n=3时10 … 。 题解:可以找到规律 正x 倒y 1 0 3 1 10 6 … … 3*x+y 3*y+x 然后构造矩阵用矩阵快速幂求解。#include <cstdio>#include <iostream>#include <cstring>using n原创 2015-05-28 22:38:42 · 847 阅读 · 0 评论 -
hdu 2276(矩阵快速幂)
题意:给出n个灯的状态’1’表示开,’0’表示关,现在给出一个规则,如果这个灯的左边的灯是开的(第一个灯的左边的灯是最后一个),那么就可以改变自己的状态,比如之前是1后来变0,之前是0后来变1,问m轮后n个灯的状态。 题解:第一个矩阵是当前灯的状态,第二个矩阵的每列就把当前行和前一行标记1,其他标记0,当前灯的状态其实就是当前灯状态和前一个灯状态的异或操作,在矩阵乘法时相加模2就是结果。#incl原创 2015-05-29 18:14:40 · 494 阅读 · 0 评论 -
poj 3233(矩阵快速幂)
题意:给出一个矩阵A和数字k,要求出矩阵S = A + A^2 + A^3 + … + A^k。 题解:首先A^x可以计算,然后需要折半计算,比如s(k) = (1 + A^(k/2)) * s(k/2),但k的奇偶不同需要分情况。#include <stdio.h>#include <string.h>const int N = 35;struct Mat { int g[N][N原创 2015-05-28 23:29:01 · 957 阅读 · 0 评论 -
hdu 4686(矩阵快速幂)
题意:如下公式 其中 a0 = A0 ai = a(i-1)*AX+AY b0 = B0 bi = b(i-1)*BX+BY 题解:构造矩阵 矩阵x: | 1 a0 b0 a0*b0 s0 | | 0 0 0 0 0 | | 0 0 0 0 0 | | 0 0 0 0 0原创 2015-05-28 22:51:59 · 607 阅读 · 0 评论 -
hdu 2243(ac自动机+矩阵快速幂)
题意:有n个小写字母组成的模式串,问长度不超过L的小写字母串中至少出现一个模式串的种类是多少。 题解:这道题和poj 2778类似,不过是把长度小于L的串的可能情况也计入,把邻接矩阵多一维存总和,然后结果用总种类数减一个模式串也不出现的种类数。总种类数很大,26^1 + 26^2 + 26^3 + … + 26^n,也用矩阵快速幂计算。f(n) = 26 * f(n - 1) + 26。 初始矩原创 2015-10-06 17:03:49 · 1475 阅读 · 0 评论