uva 10743 - Blocks on Blocks(矩阵快速幂)

题目链接:uva 10743 - Blocks on Blocks

题目大意:问说n联骨牌有多少种,旋转镜像后相同不算同一组,一行的格子必须连续,如果答案大于10000,输出后四位。

解题思路:想了一下午的递推式,实在受不了,把推出的序列在网上搜了一下,有公式ai=5?ai?1?7?ai?2+4?ai?3
(i≥5)

PS:哪位神人知道怎么推出来的请留言我,大恩不言谢~

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 3;
const int mod = 10000;
int sign[maxn][maxn] = { {0, 1, 0}, {0, 0, 1}, {4, -7, 5} };

struct MAT {
    int s[maxn][maxn];

    MAT () {}

    void set () {
        for (int i = 0; i < maxn; i++)
            for (int j = 0; j < maxn; j++)
                s[i][j] = sign[i][j];
    }

    MAT operator * (const MAT& a) {
        MAT ans;
        for (int i = 0; i < maxn; i++) {
            for (int j = 0; j < maxn; j++) {
                ans.s[i][j] = 0;
                for (int k = 0; k < maxn; k++)
                    ans.s[i][j] = (ans.s[i][j] + s[i][k] * a.s[k][j] % mod) % mod;
            }
        }
        return ans;
    }
};

MAT pow_mat (int n) {
    MAT ans, x;
    ans.set();
    x.set();

    while (n) {
        if (n&1)
            ans = ans * x;
        x = x * x;
        n >>= 1;
    }

    return ans;
}

int solve (int n) {
    if (n < 3)
        return n;
    else if (n == 3)
        return 6;
    else if (n == 4)
        return 19;

    MAT ans = pow_mat(n-5);
    return ((ans.s[2][0] * 2 + ans.s[2][1] * 6 + ans.s[2][2] * 19) % mod + mod) % mod;
}

int main () {
    int cas, n;
    scanf("%d", &cas);
    for (int i = 1; i <= cas; i++) {
        scanf("%d", &n);
        printf("Case %d: ", i);

        int ans = solve(n);
        if (n <= 9)
            printf("%d\n", ans);
        else
            printf("%04d\n", ans);
    }
    return 0;
}

uva 10743 - Blocks on Blocks(矩阵快速幂)

时间: 2024-10-28 19:37:09

uva 10743 - Blocks on Blocks(矩阵快速幂)的相关文章

uva 11651 - Krypton Number System(矩阵快速幂)

题目链接:uva 11651 - Krypton Number System 题目大意:给定进制base,和分数score,求在base进制下,有多少个数的值为score,要求不能有连续相同的数字以及前导0.计算一个数的值即为相邻两位数的平方差和. 解题思路:因为score很大,所以直接dp肯定超时,但是即使对于base=6的情况,每次新添一个数score最大增加25(0-5),所以用dp[i][j]预处理出base平方以内的总数,然后用矩阵快速幂计算. #include <cstdio> #

uva 11885 - Number of Battlefields(矩阵快速幂)

题目连接:uva 11885 - Number of Battlefields 题目大意:给出周长p,问多少种形状的周长为p的,并且该图形的最小包围矩阵的周长也是p,不包括矩形. 解题思路:矩阵快速幂,如果包含矩形的话,对应的则是斐波那契数列的偶数项,所以对应减去矩形的个数即可. #include <cstdio> #include <cstring> using namespace std; typedef long long ll; const ll MOD = 9876543

Uva 11149 - Power of Matrix ( 矩阵快速幂 )

Uva 11149 -Power of Matrix ( 矩阵快速幂 ) #include <cstdio> #include <cstring> #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 10 #define MAX_SIZE 40 struct Mat { int r, c; int mat[MAX_SIZE][MAX_SIZE]; Mat( int _r = 0 , int _c = 0 ) { CLR

UVA - 10229 - Modular Fibonacci (矩阵快速幂 + fibonacci)

题目传送:UVA - 10229 思路:就是简单的矩阵快速幂求fibonacci数列,然后注意可能中间结果会爆int,因为2^19有50多万 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #includ

UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)

题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))(A + A^2 + A^3 + ... + A^(m/2)),然后依次计算下去,就可以分解,logn的复杂度分解,注意要分奇偶. 另一种是直接构造矩阵,,然后就可以用辞阵快速幂计算了,注意要用分块矩阵的乘法. 代码如下: 倍增法: #pragma comment(linker, "/STACK:10

UVA 10655 Contemplation! Algebra(矩阵快速幂)

Given the value of a+b and ab you will have to find the value of an+bn Input The input file contains several lines of inputs. Each line except the last line contains 3 non-negative integers p, q and n. Here p denotes the value of a+b andq denotes the

UVA 10655 Contemplation! Algebra (矩阵快速幂)

题目链接:传送门 题意: 给定你三个数,p,q,n, p代表的是 a + b, q代表的是a*b; 然后求a^n + b^n 设f[i] = a^i +b^i; f[0]=2,f[1]=p; f[i]*(a+b) = a^(i+1) + b^(i+1) +a^i*b + b^i*a; f[i]*p = f[i+1] + a*b*[ a^(i-1) + b^(i-1) ] f[i+1] = f[i]*p + q*f[i-1]; 然后用矩阵加速一下就可以了(ps.这个题的输入非常坑....) 代码如

Uva10689 Yet another Number Sequence ( 矩阵快速幂 )

Uva 10689Yet another Number Sequence(  矩阵快速幂  ) 题意: 就是矩阵快速幂,没什么好说的. 分析: 其实还是斐波那契数列.只是最后对应的矩阵不是(1,1)是(a,b)了 MOD = 1; for( int i = 0; i < m; ++i ) MOD *= 10; 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace s

POJ 3734 Blocks(矩阵快速幂加递推)

Blocks Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 2931 Description Panda has received an assignment of painting a line of blocks. Since Panda is such an intelligent boy, he starts to think of a math problem of paint