zoukankan      html  css  js  c++  java
  • luogu_P2044【题解】 随机数生成器 矩阵乘法

    题面:https://www.luogu.org/problem/P2044

    矩阵乘法裸题。

    关键在于base和ans矩阵。

    经过计算待定系数可以得到。

    ans = {  (x0,1)  ,  (0,0)  }

    base = {  (a,0)  ,  (c,1)  }

    如代码所示。

    然后就可以快乐的矩阵乘法了!

    但是还有一个事。

    大数据不要忘了龟速乘!

    不然会爆炸成50分。

    代码如下:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll mod,a,c,xx,n,g;
    struct node{
        ll m[5][5];
    }ans,base;
    inline ll qm(ll x,ll y){
        ll res=0;
        while(y){
            if(y&1) res=(res+x)%mod;
            x=(x+x)%mod;
            y>>=1;
        }
        return res;
    }
    inline node mul(node x,node y){
        node res;
        memset(res.m,0,sizeof(res.m));
        for(int i=1;i<=2;i++)
            for(int k=1;k<=2;k++){
                if(!x.m[i][k]) continue;
                for(int j=1;j<=2;j++){
                    res.m[i][j]+=qm(x.m[i][k],y.m[k][j]);
                    res.m[i][j]%=mod;
                }
            }
        return res;
    }
    inline void qp(ll p){
        while(p){
            if(p&1) ans=mul(ans,base);
            base=mul(base,base);
            p>>=1;
        }
    }
    int main()
    {
        scanf("%lld%lld%lld%lld%lld%lld",&mod,&a,&c,&xx,&n,&g);
        ans.m[1][1]=xx;ans.m[1][2]=1;
        base.m[1][1]=a;base.m[2][1]=c;base.m[2][2]=1;
        qp(n);
        printf("%lld
    ",ans.m[1][1]%g);
        system("pause");
        return 0;
    }
  • 相关阅读:
    SpringBoot2 application.properties方式加载配置文件
    php第三十节课
    php第二十九节课
    php第二十八节课
    php第二十七节课
    php第二十六节课
    php第二十五节课
    php第二十四节课
    DBDA
    php第二十三节课
  • 原文地址:https://www.cnblogs.com/ChrisKKK/p/11455408.html
Copyright © 2011-2022 走看看