FZU - 1683 纪念SlingShot 矩阵快速幂

题目大意:已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5,对于给定的每个n,输出F(0)+ F(1)+ …… + F(n) mod 2009。

解题思路:借用别人的图

这题和HDU - 1757 A Simple Math Problem和相似,只不过这题多了个和,其实思路是差不多的

#include<cstdio>
#include<cstring>
#define mod 2009
const int N = 4;
typedef long long ll;

struct Matrix{
    ll mat[N][N];
}a, b, tmp;
int n;
void init() {
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            a.mat[i][j] = b.mat[i][j] = 0;

    for(int i = 0; i < N; i++)
        b.mat[i][i] = 1;
    a.mat[0][0] = a.mat[0][1] = a.mat[2][1] = a.mat[3][2] = 1;
    a.mat[1][1] = 3;
    a.mat[1][2] = 2;
    a.mat[1][3] = 7;
}

Matrix matrixMul(Matrix x, Matrix y) {
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++) {
            tmp.mat[i][j] = 0;
            for(int k = 0; k < N; k++)
                tmp.mat[i][j] += (x.mat[i][k] * y.mat[k][j]) % mod;
        }
    return tmp;
}

void solve() {
    while(n) {
        if(n & 1)
            b = matrixMul(b,a);
        a = matrixMul(a,a);
        n >>= 1;
    }
}

int main() {
    int test, cas = 1;
    scanf("%d", &test);
    while(test--) {
        scanf("%d", &n);
        init();
        if(n <= 2) {
            switch(n) {
                case 0:printf("Case %d: 1\n", cas++);break;
                case 1:printf("Case %d: 4\n");break;
                case 2:printf("Case %d: 9\n");break;
            }
            continue;
        }
        n -= 1;
        solve();
        printf("Case %d: %lld\n",cas++, (b.mat[0][0] * 4 + b.mat[0][1] * 5 + b.mat[0][2] * 3 + b.mat[0][3] * 1) % mod);
    }
    return 0;
}
时间: 2024-10-11 06:59:53

FZU - 1683 纪念SlingShot 矩阵快速幂的相关文章

FZU 1683 纪念SlingShot

Problem 1683 纪念SlingShot Accept: 561    Submit: 1969Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5,对于给定的每个n,输出F(0)+ F(1)+ …… + F(n) mod 2009. Input 第一行是一整数m,代表

FZU - 1692 Key problem 矩阵快速幂

题目大意:有n个人围成一圈玩游戏,游戏有m个回合.每个人每回合能得到(L * 左边那个人的苹果数量) + (R * 右边那个人的苹果数量),问最后每个人得到的苹果数量 解题思路:矩阵的话比较好写,就不解释了,关键是怎么将矩阵乘法的复杂度下降,因为每个人每回合矩阵变化都是相同的,所以只需要求出第一行就可以了,经过偏移就可以得到其他行的了 这里还有一个剪枝点,传参时要用引用,不然会超时... #include<cstdio> #include<cstring> typedef long

FZU 1911 Construct a Matrix ( 矩阵快速幂 + 构造 )

FZU 1911 Construct a Matrix (  矩阵快速幂 + 构造 ) 题意: 需要构造一个矩阵满足如下要求: 1.矩阵是一个S(N)*S(N)的方阵 2.S(N)代表斐波那契数列的前N项和模上M 3.矩阵只能由1, 0, -1组成 4.矩阵每行每列的和不能相等 Here, the Fibonacci numbers are the numbers in the following sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 1

FZU 2040 Tiling (矩阵快速幂)

题目地址:FZU 2040 重点在于构造矩阵,先状压,然后根据每一行是否与下一行分割了来构造一个2^(m-1)*2^(m-1)的矩阵,然后套上矩阵快速幂就可以了.937ms险过.. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #inclu

[矩阵快速幂] fzu 2117 特殊的数

题意: 中文题不解释 注意是n位数! 思路: 中文在群里问了大神们,终于领悟到这种递推的精华 对于给定的n都会包含有四种状态 0.7和9的个数都是奇数 1.7是奇数,9是偶数 2.7是偶数,9是奇数 3.7是偶数,9是偶数 显然状态3是我们要状态,但是他们之间是可以互相转移的 所以对于每次添加一个空位放数字,建立转移矩阵 | 3 1 1 0 | | 1 3 0 1 | | 1 0 3 1 | | 0 1 1 3 | 初始状态为 (0,0,0,1) 然后就是n次方了~利用矩阵快速幂 最后ans.m

Foj1683矩阵快速幂水题

Foj 1683 纪念SlingShot 题目链接:http://acm.fzu.edu.cn/problem.php?pid=1683 题目:已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5,对于给定的每个n,输出F(0)+ F(1)+ -- + F(n) mod 2009.直接构造矩阵就好了,这个矩阵还是很好构造的. 求左边的矩阵矩阵的n-2次幂,和右边的矩阵想成就可以了. //Author: xiaow

2014 Super Training #10 G Nostop --矩阵快速幂

原题: FZU 2173 http://acm.fzu.edu.cn/problem.php?pid=2173 一开始看到这个题毫无头绪,根本没想到是矩阵快速幂,其实看见k那么大,就应该想到用快速幂什么的,况且n<=50,可以用矩阵来表示图. 1.为什么能用矩阵快速幂呢? 原理: 原始矩阵m[][]中,m[u][v]代表u到v的花费,求矩阵的k次幂后,此时m[u][v]代表,从u走向b经过v步的最少花费注意此时矩阵的相乘应该写成:m[a][b]=min(m[a][1]+m[1][b],...m[

矩阵快速幂刷题系列

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