【HDOJ 4686】 Arc of Dream (矩阵快速幂)

【HDOJ 4686】 Arc of Dream (矩阵快速幂)

两个公式

a(i) = a(i-1)*Ax+Ay

b(i) = b(i-1)*Bx+By

0~(n-1) 的a(i)*b(i)

初始矩阵为                                       求幂矩阵为

a0                                                      Ax          0           0          0         Ay

b0                                                      0            Bx         0          0         By

a0*b0                                             Ax*By     Ay*Bx    Ax*Bx      0      Ay*By

0                                                        0             0           1          1          0

1                                                        0             0           0          0          0

(艾玛 这么生敲矩阵太累人了。。。。还好行列不多。。。

这样经过一次矩阵乘法之后 会变成。。。

a1

b1

a1*b1

a0*b0

1

两次

a2

b2

a2*b2

a0*b0+a1*b1

1

......自己写写看 乘的过程就不写了。。忒累了

然后写个矩阵乘法套个快速幂就WA了………………精度要求 一开始是开成long long了。。。不过初始矩阵传成了int。。。该打。。。。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
#define mod 1000000007

using namespace std;

typedef struct Matrix Matrix;

struct Matrix
{
    ll mx[5][5];
    void Init(ll ax,ll ay,ll bx,ll by)//初始矩阵
    {
        memset(mx,0,sizeof(mx));
        mx[0][0] = ax;
        mx[0][4] = ay;
        mx[1][1] = bx;
        mx[1][4] = by;
        mx[2][0] = ax*by%mod;
        mx[2][1] = ay*bx%mod;
        mx[2][2] = ax*bx%mod;
        mx[2][4] = ay*by%mod;
        mx[3][2] = mx[3][3] = mx[4][4] = 1;
    }

    void Emp()//单位矩阵
    {
        memset(mx,0,sizeof(mx));
        for(int i = 0; i < 5; ++i) mx[i][i] = 1;
    }

    Matrix operator * (const Matrix a)const//矩阵乘法
    {
        Matrix x;
        memset(x.mx,0,sizeof(x.mx));
        for(int i = 0; i < 5; ++i)
            for(int j = 0; j < 5; ++j)
                for(int k = 0; k < 5; ++k)
                    x.mx[i][j] = (x.mx[i][j]+mx[i][k]*a.mx[k][j]%mod)%mod;
        return x;
    }

};

Matrix pow(Matrix a,ll b)//快速幂
{
    Matrix ans;
    ans.Emp();
    while(b)
    {
        if(b&1) ans = ans*a;
        a = a*a;
        b >>= 1;
    }
    return ans;
}

int main()
{
    ll n,a,b,ax,ay,bx,by;
    while(~scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&a,&ax,&ay,&b,&bx,&by))//没改 杭电的题 注意改成I64d
    {
        a%=mod;
        b%=mod;
        ax%=mod;
        ay%=mod;
        bx%=mod;
        by%=mod;
        Matrix mx;
        mx.Init(ax,ay,bx,by);
        mx = pow(mx,n);
        printf("%lld\n",(((a*mx.mx[3][0]%mod+b*mx.mx[3][1]%mod)%mod+a%mod*b%mod*mx.mx[3][2]%mod)%mod+mx.mx[3][4])%mod);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 22:27:35

【HDOJ 4686】 Arc of Dream (矩阵快速幂)的相关文章

HDOJ 4686 Arc of Dream 矩阵快速幂

矩阵快速幂: 根据关系够建矩阵 , 快速幂解决. Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 2164    Accepted Submission(s): 680 Problem Description An Arc of Dream is a curve defined by following fun

HDU 4686 Arc of Dream 矩阵快速幂,线性同余 难度:1

http://acm.hdu.edu.cn/showproblem.php?pid=4686 当看到n为小于64位整数的数字时,就应该有个感觉,acm范畴内这应该是道矩阵快速幂 Ai,Bi的递推式题目已经给出, Ai*Bi=Ax*Bx*(Ai-1*Bi-1)+Ax*By*Ai-1+Bx*Ay*Bi-1+Ay*By AoD(n)=AoD(n-1)+AiBi 构造向量I{AoD(i-1),Ai*Bi,Ai,Bi,1} 初始向量为I0={0,A0*B0,A0,B0,1} 构造矩阵A{ 1,0,0,0,

HDOJ 4686 Arc of Dream 矩阵高速幂

矩阵高速幂: 依据关系够建矩阵 , 高速幂解决. Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 2164    Accepted Submission(s): 680 Problem Description An Arc of Dream is a curve defined by following fun

HDU 4686 Arc of Dream(矩阵快速幂)

题目地址:HDU 4686 我去..因为忘记把函数里的k定义成64位的,导致TLE了一晚上...晕.. 这题没什么技巧,就是根据公式构造就行. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #in

S - Arc of Dream 矩阵快速幂

An Arc of Dream is a curve defined by following function: where a 0 = A0 a i = a i-1*AX+AY b 0 = B0 b i = b i-1*BX+BY What is the value of AoD(N) modulo 1,000,000,007? InputThere are multiple test cases. Process to the End of File. Each test case con

hdu4686 Arc of Dream 矩阵快速幂

An Arc of Dream is a curve defined by following function: wherea0 = A0ai = ai-1*AX+AYb0 = B0bi = bi-1*BX+BYWhat is the value of AoD(N) modulo 1,000,000,007? 矩阵快速幂 1 #include<stdio.h> 2 #include<string.h> 3 typedef long long ll; 4 const int mod

HDOJ 5411 CRB and Puzzle 矩阵快速幂

直接构造矩阵,最上面一行加一排1.快速幂计算矩阵的m次方,统计第一行的和 CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 133    Accepted Submission(s): 63 Problem Description CRB is now playing Jigsaw Puzzle. There

hdoj 1575 Tr A 【矩阵快速幂】

Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3020    Accepted Submission(s): 2251 Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据. 每组数据的第一行有

HDOJ 233 Matrix 5015【矩阵快速幂】

233 Matrix Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1355    Accepted Submission(s): 806 Problem Description In our daily life we often use 233 to express our feelings. Actually, we may