• BZOJ2476: 战场的数目(矩阵快速幂)


    题意

    题目链接

    Sol

    神仙题Orzzz

    考虑两边是否有(1)

    (f[i])表示周长为(2i)的方案数

    第一种情况:左侧或右侧有一个1,那么把这个1删去,对应的方案数为(f[i - 1])

    第二种情况:左侧和右侧都有一个1,把这两个1删去,对应的方案数为(f[i - 2])

    第三种情况:左侧右侧都没有1,把最下面一层删去,对应的方案为(f[i - 1])

    综上,递推式为(f[i] = 3f[i - 1] - f[i - 2])

    最后再减去矩形的方案为(N / 2 - 1)

    矩阵快速幂优化一下

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 2e5 + 10, mod = 987654321;
    inline int read() {
        char c = getchar(); int x = 0, f = 1;
        while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * f;
    }
    int N;
    int add(int x, int y) {
    	if(x + y < 0) return x + y + mod;
    	return x + y >= mod ? x + y - mod : x + y;
    }
    int mul(int x, int y) {
    	return 1ll * x * y % mod;
    }
    struct Ma {
    	int m[3][3];
    	Ma() {
    		memset(m, 0, sizeof(m));
    	}
    	Ma operator * (const Ma &rhs) const {
    		Ma ans;
    		for(int k = 1; k <= 2; k++)
    			for(int i = 1; i <= 2; i++)
    				for(int j = 1; j <= 2; j++)
    					ans.m[i][j] = add(ans.m[i][j], mul(m[i][k], rhs.m[k][j]));
    		return ans;
    	}
    };
    Ma MatrixPow(Ma a, int p) {
    	Ma base;
    	for(int i = 1; i <= 2; i++) base.m[i][i] = 1;
    	if(p < 0) return base;
    	while(p) {
    		if(p & 1) base = base * a;
    		a = a * a; p >>= 1;
    	}
    	return base;
    }
    int main() {
    	while(scanf("%d", &N) && (N)) {
    		if((N & 1) || (N < 8)) {puts("0"); continue;}
    		if(N == 8) {printf("2
    "); continue;}
    		N >>= 1;
    		Ma a;
    		a.m[1][1] = 3; a.m[1][2] =  - 1;
    		a.m[2][1] = 1; a.m[2][2] = 0;
    		a = MatrixPow(a, N - 5);
    		printf("%d
    ", add(add(mul(13, a.m[1][1]), mul(5, a.m[1][2])), -(N - 1)));
    	}
        return 0;
    }
    /*
    7
    8
    9
    10
    0
    */
    
  • 相关阅读:
    创建逻辑卷LVM以及swap分区
    Linux下命令别名配置
    vim多行注释与删除
    Linux下parted分区超过2TB硬盘-分区格式化
    scp命令限速远程拷贝
    tar命令加密压缩/解密解压
    centos下dnsmasq安装与配置
    Mac OS: xcrun: error: invalid active developer path, missing xcrun
    C/C++编译器GCC:GNU Compiler Collection
    es分页查询限制的问题
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/10046667.html
Copyright © 2020-2023  润新知