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 = 987654321;

void mul(ll a[2][2], ll b[2][2], ll c[2][2]) {
    ll ans[2][2];
    memset(ans, 0, sizeof(ans));

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {

            for (int k = 0; k < 2; k++)
                ans[i][j] = (ans[i][j] + a[i][k] * b[k][j]) % MOD;
        }
    }
    memcpy(c, ans, sizeof(ans));
}

void power (ll a[2][2], int n) {
    ll ans[2][2] = {1, 0, 1, 0};
    while (n) {
        if (n&1)
            mul(ans, a, ans);
        mul(a, a, a);
        n /= 2;
    }
    memcpy(a, ans, sizeof(ans));
}

int main () {
    int p;
    while (scanf("%d", &p) == 1 && p) {
        if (p&1 || p < 6) {
            printf("0\n");
            continue;
        }

        p = (p - 4) / 2;

        ll a[2][2] = {1, 1, 1, 0};
        /*
        power(a, 2*p-1);
        printf("%lld\n", (a[0][0] + a[0][1]  - p - 1 + MOD) % MOD);
        */
        power(a, 2*p);
        printf("%lld\n", (a[1][0] - p - 1 + MOD) % MOD);
    }
    return 0;
}

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

时间: 2024-10-12 13:33:27

uva 11885 - Number of Battlefields(矩阵快速幂)的相关文章

UVA 11651 - Krypton Number System(DP+矩阵快速幂)

UVA 11651 - Krypton Number System 题目链接 题意:给一个进制base,一个分数score求该进制下,有多少数满足一下条件: 1.没有连续数字 2.没有前导零 3.分数为score,分数的计算方式为相邻数字的平方差的和 思路:先从dp入手,dp[i][j]表示组成i,最后一个数字为j的种数,然后进行状态转移,推出前面一步能构成的状态,也就是到dp[(b - 1) * (b - 1)][x]. 然后可以发现后面的状态,都可以由前面这些状态统一转移出来,这样就可以利用

UVA 11885 - Number of Battlefields(斐波那契)

11885 - Number of Battlefields 题意:给周长,求能围成的战场数目,不包括矩形. 思路:具体的递推没递推出来,但是看了网上一个规律,如果包括矩形的答案应该是斐波那契数列(但是奇数情况为0),然后减去矩形数目就是答案,矩形数目为n / 2 - 1,用矩阵快速幂就能求了. 具体的递推过程哪位大神能指点下... 代码: #include <stdio.h> #include <string.h> const long long MOD = 987654321;

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 <algori

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

A - Number Sequence(矩阵快速幂或者找周期)

Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Input The input consists of multiple test cases. Each test case contains 3

CF - 392 C. Yet Another Number Sequence (矩阵快速幂)

CF - 392 C. Yet Another Number Sequence 题目传送门 这个题看了十几分钟直接看题解了,然后恍然大悟,发现纸笔难于描述于是乎用Tex把初始矩阵以及转移矩阵都敲了出来 \(n\le 1e17\) 这个数量级求前缀和,发现递推关系之后矩阵快速幂是可以求出来的,所以就尝试把\(A_i(k)\) 的递推式求出来. \[ A_{i-1}(k) = F_{i-1} * (i-1) ^ k\A_{i-2}(k) = F_{i-2} * (i-2) ^ k \] \[ \be

ZOJ 2105 Number Sequence(矩阵快速幂)

题意: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给定A,B,求f(n). 法一: 网上较多的题解都提到了寻找1 1循环节的方法,的确非常巧妙,每位0~6,共7种可能,相邻两位共49种可能,因此循环周期至多为49,一旦出现相同数对,那么其后必相同.但是,该方法只是简单提及了49,却并没有证明1 1循环节一定存在,没有排除可能前面一段不循环,后面一段开始周期性循环的可能性.(是我悟性太差吗,为什么大多数题解都只谈

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