zoukankan      html  css  js  c++  java
  • bzoj3240: [Noi2013]矩阵游戏

    Description

    婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储)。她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][j]满足下面的递推式:

    F[1][1]=1
    F[i,j]=a*F[i][j-1]+b (j!=1)
    F[i,1]=c*F[i-1][m]+d (i!=1)
    递推式中a,b,c,d都是给定的常数。

    现在婷婷想知道F[n][m]的值是多少,请你帮助她。由于最终结果可能很大,你只需要输出F[n][m]除以1,000,000,007的余数。

    用 十进制快速幂 计算 一次函数的多层嵌套,时间复杂度O(logn+logm)。

    #include<cstdio>
    #include<cstring>
    typedef long long i64;
    const int P=1e9+7;
    struct num{
        char a[1000077];
        int l;
        void R(){
            scanf("%s",a);
            l=strlen(a);
            int p=l-1;
            for(--a[p];a[p]<'0';a[p]+=10,--a[--p]);
        }
    }n,m;
    struct F{
        int a,b;
        F operator()(F f)const{
            return (F){int(i64(a)*f.a%P),int((i64(a)*f.b+b)%P)};
        }
        void R(){
            scanf("%d%d",&a,&b);
        }
    }v1,v2;
    F operator^(F a,const num&n){
        F v=(F){1,0},ts[10],u;
        ts[0]=v;
        for(int i=1;i<10;++i)ts[i]=a(ts[i-1]);
        for(int i=0;i<n.l;++i){
            u=v=v(v);
            u=u(u),u=u(u);
            v=u(v(ts[n.a[i]-'0']));
        }
        return v;
    }
    int main(){
        n.R();m.R();
        v1.R(),v2.R();
        v1=v1^m;
        v2=v1(v2(v1)^n);
        printf("%d
    ",(v2.a+v2.b)%P);
        return 0;
    }
  • 相关阅读:
    重置csr
    修改node节点名称
    k8s报错解决
    k8s测试容器之间是否互通
    MyEclipse------executeBatch()使用方法
    MyEclipse------execute()使用方法
    MyEclipse------如何查询MySQL数据库里面表的信息
    MyEclipse------如何连接MySQL
    MyEclipse------从服务器下载文件
    MyEclipse------各种问题解决方法
  • 原文地址:https://www.cnblogs.com/ccz181078/p/7518834.html
Copyright © 2011-2022 走看看