2875: [Noi2012]随机数生成器 矩阵乘法+快速乘

来源:互联网 发布:极课大数据怎么样 编辑:程序博客网 时间:2024/05/16 09:32

傻逼题,快速乘忘记取模TLE了一发。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;long long m,a,c,x0,n,g;long long mul(long long a,long long b){    long long ans=0;    for (;b;b>>=1,(a<<=1)%=m)        if (b&1) (ans+=a)%=m;    return ans;}struct Matrix{    long long a[2][2];    Matrix()    {        memset(a,0,sizeof(a));    }    friend Matrix operator*(Matrix a,Matrix b)    {        Matrix ans;        for (int i=0;i<2;i++)            for (int j=0;j<2;j++)                for (int k=0;k<2;k++)                    (ans.a[i][j]+=mul(a.a[i][k],b.a[k][j]))%=m;        return ans;    }    friend Matrix operator^(Matrix a,long long b)    {        Matrix ans;        for (int i=0;i<2;i++) ans.a[i][i]=1;        for (;b;b>>=1,a=a*a)            if (b&1) ans=ans*a;        return ans;    }}A;int main(){    scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);    A.a[0][0]=a; A.a[0][1]=c; A.a[1][0]=0; A.a[1][1]=1;    A=A^n;     cout << (mul(A.a[0][0],x0)+A.a[0][1])%m%g << endl;    return 0;}
0 0
原创粉丝点击