zoukankan      html  css  js  c++  java
  • 洛谷P1397 [NOI2013]矩阵游戏

    矩阵快速幂+费马小定理

    矩阵也是可以跑费马小定理的,但是要注意这个:

    (图是盗来的QAQ)

    就是说如果矩阵a[i][i]都是相等的,那么就是mod p 而不是mod p-1了

    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #define MOD 1000000007
    #define MAXN 1000000+10
    #define ll long long
    #define pb push_back
    #define ft first
    #define sc second
    #define mp make_pair
    using namespace std;
    char s1[MAXN],s2[MAXN];
    int n,m;
    int a,b,c,d,p;
    struct Mat{
        int a[2][2];
        Mat(){
            memset(a,0,sizeof(a));
        }
        friend Mat operator * (const Mat &A,const Mat B){
            Mat C;
            for(int i=0;i<2;i++){
                for(int j=0;j<2;j++){
                    for(int k=0;k<2;k++){
                        C.a[i][j]+=(1LL*A.a[i][k]*B.a[k][j]%MOD);
                        C.a[i][j]%=MOD;
                    }    
                }    
            }    
            return C;
        }
        friend Mat operator ^ (Mat A,int p){
            Mat B;
            B.a[0][0]=B.a[1][1]=1;
            while(p){
                if(p&1){
                    B=B*A;
                }    
                A=A*A;
                p>>=1;
            }
            return B;
        }
    };
    void solve(){
        scanf("%s%s",s1+1,s2+1);
        scanf("%d%d%d%d",&a,&b,&c,&d);
        p=MOD-1+(a==1);
        int len=strlen(s2+1);
        for(int i=1;i<=len;i++){
            m=(1LL*m*10+s2[i]-'0')%p;
        }
        m--;if(m<0)m+=p;
        Mat A;
        A.a[0][0]=a,A.a[0][1]=b,A.a[1][1]=1;
        Mat B;
        B=A^m;
        Mat C;
        C=B;
        A.a[0][0]=c,A.a[0][1]=d,A.a[1][1]=1;
        C=C*A;
        p=MOD-1+(C.a[0][0]==C.a[1][1]);
        len=strlen(s1+1);
        for(int i=1;i<=len;i++){
            n=(1LL*n*10+s1[i]-'0')%p;
        }
        n--;if(n<0)n+=p;
        C=C^n;
        C=C*B;
        int ans=(C.a[0][0]+C.a[0][1])%MOD;
        printf("%d ",ans);
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        solve();
        return 0;
    }   
  • 相关阅读:
    【LeetCode】96.Unique Binary Search Trees
    【LeetCode】136.Single Number
    VirtualBox下Linux加载Windows的共享目录
    Macbook上Windows的触摸板设置工具
    [转]太岁三煞五黄
    [转]UI、GUI、UE、UX、ID、UED、UCD的区别
    紫微斗数:命主和身主
    [转]如何降低二手烟的危害
    [转]从第六十三卦到第六十四卦
    Mac显示和隐藏隐藏文件
  • 原文地址:https://www.cnblogs.com/w-h-h/p/8325566.html
Copyright © 2011-2022 走看看