哈工大的2255题解(矩阵快速幂)

来源:互联网 发布:vs开发php 编辑:程序博客网 时间:2024/06/08 15:41

矩阵快速幂最主要的是核心矩阵的构建,这题不是构建和每项有关的矩阵,而是构建和前n项和有关的矩阵利用an=sn-sn-1,记住构造的式子里未知数只能有sn,sn-1之类的

#include<stdio.h>

#include<string.h>
#include<stdlib.h>
#define mod 10000000
struct juzheng{
    long long a[3][3];
};
int ju[3];
juzheng mul(juzheng ch, juzheng th)
{
    juzheng ans;
    int i,j,k;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            ans.a[i][j]=0;
            for(k=0;k<3;k++){
                ans.a[i][j]+=(ch.a[i][k]*th.a[k][j]);
            }
            ans.a[i][j]%=mod;
        }
    }
    return ans;
}
int pow(juzheng ch, int n)
{
    juzheng ans;
    int i,j;
    for(i=0;i<3;i++){//初始化为单位矩阵
        for(j=0;j<3;j++){
            if(i==j)
                ans.a[i][j]=1;
            else ans.a[i][j]=0;
        }
    }
    while(n){
        if(n%2){
            ans=mul(ans,ch);
        }
        ch=mul(ch,ch);
        n/=2;
    }
    long long zhi=0;
    for(i=0;i<3;i++){
        zhi+=(ju[i]*ans.a[0][2-i]);
        zhi%=mod;
    }
    return zhi;
}
int main()
{
    int num,i,j;
    juzheng ch;
    scanf("%d",&num);
    while(num--){
        long long a,b,p,q;
        long long s,e;
        scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&p,&q,&s,&e);
        for(i=0;i<3;i++){//构造出核心矩阵
            for(j=0;j<3;j++){
                ch.a[i][j]=0;
            }
        }
        ju[0]=a;
        ju[1]=a+b;
        ju[2]=a+b+p*b+q*a;
        ch.a[0][0]=p+1;
        ch.a[0][1]=q-p;
        ch.a[0][2]=-1*q;
        ch.a[1][0]=1;
        ch.a[2][1]=1;
        long long ss=0,ee=0;
        if(s<=3&&s>0){//如果s==0,就可能越界
            ss=ju[s-1];
        }
        else if(s){//不要忘记这个条件,worry了好多次
            ss=pow(ch,s-3);
        }
        if(e<=2){
            ee=ju[e];
        }
        else {
            ee=pow(ch,e-2);
        }
        ee=(ee+mod)%mod;
        ss=(ss+mod)%mod;
        printf("%d\n",(ee-ss+mod)%mod);
    }
    return 0;
}

原创粉丝点击