BZOJ 2875 [NOI2012] 随机数生成器

来源:互联网 发布:智多星软件视频教程 编辑:程序博客网 时间:2024/05/21 10:34
#include<stdio.h>  #include<string.h>  #include<stdlib.h>  #include<algorithm>  #include<iostream>  #include<vector>  #include<stack>  #include<queue>  using namespace std;  #define MAX 3  struct mat{long long c[MAX][MAX];};  long long M,A,C,X0,N,G;  long long mult1(long long A,long long B)  {        long long tmp=0;        while(B!=0)        {              if(B&1)  tmp=(tmp+A)%M;              B>>=1;              A=(A<<1)%M;        }        return tmp%M;  }  mat mult(mat A,mat B)  {        mat now;        for(int i=1;i<=2;i++)              for(int j=1;j<=2;j++)              {                    now.c[i][j]=0;                    for(int k=1;k<=2;k++)                          now.c[i][j]=(now.c[i][j]+mult1(A.c[i][k],B.c[k][j]))%M;              }        return now;  }  mat power(mat now,long long n)  {        if(n==1)   return now;        else if(n&1)              return mult(power(now,n-1),now);        else         {              mat use;              use=power(now,n/2);              return mult(use,use);        }  }  mat a,ans;  void work()  {        mat now;        a.c[1][1]=A;a.c[1][2]=0;        a.c[2][1]=C;a.c[2][2]=1;        now=power(a,N);                ans.c[1][1]=X0;ans.c[1][2]=1;        ans.c[2][1]=0;ans.c[2][2]=0;         ans=mult(ans,now);       }  int main()  {        //freopen("random.in","r",stdin);        //freopen("random.out","w",stdout);         scanf("%lld%lld%lld%lld%lld%lld",&M,&A,&C,&X0,&N,&G);        work();        printf("%lld\n",ans.c[1][1]%G);        //system("pause");        return 0;  }  


—————————————————————————————————

本文原创自Sliencecsdn技术博客。

本博客所有原创文章请以链接形式注明出处。

欢迎关注本技术博客,本博客的文章会不定期更新。


大多数人想要改造这个世界,但却罕有人想改造自己。

世上没有绝望的处境,只有对处境绝望的人。

                                              ————By slience

—————————————————————————————————


0 0
原创粉丝点击