bzoj2875: [Noi2012]随机数生成器 裸矩阵乘法

来源:互联网 发布:立体设计图软件 编辑:程序博客网 时间:2024/05/17 04:55
裸题,注意细节就可以了,不再赘述。
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>using namespace std;typedef  long long sint;struct matrix{    sint a[2][2];    void cl()    {        memset(a,0,sizeof(a));    }};sint x0,a,c,g,m,n;sint mul(sint X,sint Y){    sint re=0;    while(Y)    {        if(Y&1) re+=X,re=(re>m?re-m:re);        X+=X,X=(X>m?X-m:X);        Y>>=1;    }    return re;}matrix operator * (matrix aa,matrix bb){    matrix cc;cc.cl();     for(int i=0;i<2;i++)    {        for(int j=0;j<2;j++)        {            for(int k=0;k<2;k++)            {                cc.a[i][j]+=mul(aa.a[i][k],bb.a[k][j]);                if(cc.a[i][j]>m) cc.a[i][j]-=m;            }        }    }    return cc;}sint quick(){    matrix res;    res.cl();    res.a[0][0]=1;res.a[1][1]=1;    matrix x,y;x.cl();y.cl();    x.a[0][0]=x0;x.a[0][1]=c;    y.a[0][0]=a;y.a[1][0]=y.a[1][1]=1;    while(n)    {        if(n&1)        {            res=res*y;        }        y=y*y;        n>>=1;    }    x=x*res;    return x.a[0][0]%g;}int main(){    //freopen("random20.in","r",stdin);    cin>>m>>a>>c>>x0>>n>>g;    a%=m;c%=m;    cout<<quick();    return 0;}

0 0