您的位置:首页 > 其它

bzoj 2875: [Noi2012]随机数生成器

2016-03-22 22:55 459 查看
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
ll x[2][2],y[2][2],m,a,c,x0,n,g;
ll chen1(ll a1,ll a2)
{
long long a3;
if(!a2)
return 0;
a3=chen1(a1,a2>>1);
a3=(a3+a3)%m;
if(a2&1)
a3=(a3+a1)%m;
return a3;
}
void chen(ll x1[2][2],ll x2[2][2])
{
long long x3[2][2];
memset(x3,0,sizeof(x3));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
x3[i][j]=(x3[i][j]+chen1(x1[i][k],x2[k][j]))%m;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
x1[i][j]=x3[i][j];
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
x[0][0]=1;
x[1][1]=1;
y[0][0]=a;
y[0][1]=c;
y[1][1]=1;
for(;n;)
{
if(n%2)
chen(x,y);
chen(y,y);
n>>=1;
}
printf("%lld\n",(chen1(x[0][0],x0)+x[0][1])%m%g);
return 0;
}


矩阵乘法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: