• UVA 10655 Contemplation! Algebra


    第一直觉是解方程,把a,b都算出来,显然这是不科学的做法,如果a,b都是小数..那就GG了。

    正解如下:

    计算前几项,可以看出递推式

    有了递推式,就可以构造矩阵,进行矩阵快速幂

    这题还有2个WA点:

    1.这样的数据是合法的:0 0 5,所以最后一组读入的时候并不是p,q都为0就break。

    2. n=0的时候需要特判

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    long long x, y;
    int n;
    
    struct Matrix
    {
        long long A[5][5];
        int R, C;
        Matrix operator*(Matrix b);
    };
    
    Matrix X, Y, Z;
    
    Matrix Matrix::operator*(Matrix b)
    {
        Matrix c;
        memset(c.A, 0, sizeof(c.A));
        int i, j, k;
        for (i = 1; i <= R; i++)
            for (j = 1; j <= C; j++)
                for (k = 1; k <= C; k++)
                    c.A[i][j] = c.A[i][j] + A[i][k] * b.A[k][j];
        c.R=R; c.C=b.C;
        return c;
    }
    
    void init()
    {
        n = n - 1;
        Z.A[1][1] = x, Z.A[1][2] = x*x-2*y; Z.R = 1; Z.C = 2;
        Y.A[1][1] = 1, Y.A[1][2] = 0, Y.A[2][1] = 0, Y.A[2][2] = 1; Y.R = 2; Y.C = 2;
        X.A[1][1] = 0, X.A[1][2] = -y, X.A[2][1] = 1, X.A[2][2] = x; X.R = 2; X.C = 2;
    }
    
    void work()
    {
        while (n)
        {
            if (n % 2 == 1) Y = Y*X;
            n = n >> 1;
            X = X*X;
        }
        Z = Z*Y;
    
        printf("%lld
    ", Z.A[1][1]);
    }
    
    int main()
    {
        while(scanf("%lld%lld%d",&x,&y,&n)==3)
        {
            if(n==0)
            {
                printf("2
    ");
            }
            else{
                init();
                work();
            }
        }
        return 0;
    }
  • 相关阅读:
    Java代码是怎么运行的
    Java单例模式
    redis分布式锁实现
    zuul2.0
    配置ssh免密钥登陆多台从机
    Nifi-install-config
    Configure Access to Multiple Clusters
    kubernetes集群搭建(kubeadm,kubelet)
    shell 编程
    系统管理
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5236230.html
Copyright © 2020-2023  润新知