题解 P2044 【[NOI2012]随机数生成器】
诸位大佬都好强啊
其实蒟蒻的我看到题的第一眼想法就是矩乘啊
后来懒惰求知欲强的我就抱着学习yy一下的心理看一看题解
。。。。。。
。。。。。。
看不懂 自己推吧
就把那个乘上那个,和那个,这个,那样一下就好了。
咳咳
就这样吧:
对于蒟蒻的我来说矩乘和快速幂还是可以的:乘号写成加号什么的
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
long long s[4][4];
};
long long n,m,a,c,g,x0;
node ans,onc;
node multi(node x,node y)
{
node z;
z.x=x.x,z.y=y.y;
for(register int i=1;i<=z.x;i++)
{
for(register int j=1;j<=z.y;j++)
{
z.s[i][j]=0;
for(register int k=1;k<=x.y;k++)z.s[i][j]=(z.s[i][j]%m+x.s[i][k]%m*y.s[k][j]%m)%m;
}
}
return z;
}
void quick_pow(long long p)
{
while(p!=0)
{
if(p%2==1)ans=multi(ans,onc);
onc=multi(onc,onc);
p=p/2;
}
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
ans.x=1,ans.y=2;
ans.s[1][1]=x0,ans.s[1][2]=1;
onc.x=2,onc.y=2;
onc.s[1][1]=a,onc.s[1][2]=0,onc.s[2][1]=c,onc.s[2][2]=1;
quick_pow(n);
printf("%lld",ans.s[1][1]%g);
return 0;
}
而后狂 WA 不止
还是题解强
要快速乘防炸的
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
long long s[4][4];
};
long long n,m,a,c,g,x0;
node ans,onc;
long long quick_mul(long long a,long long b,long long p)
{
long long ret=0;
while(b)
{
if(b&1)ret=(ret+a)%p;
a=2*a%p;
b>>=1;
}
return ret;
}
node multi(node x,node y)
{
node z;
z.x=x.x,z.y=y.y;
for(register int i=1;i<=z.x;i++)
{
for(register int j=1;j<=z.y;j++)
{
z.s[i][j]=0;
for(register int k=1;k<=x.y;k++)z.s[i][j]=(z.s[i][j]%m+quick_mul(x.s[i][k]%m,y.s[k][j]%m,m))%m;
}
}
return z;
}
void quick_pow(long long p)
{
while(p!=0)
{
if(p%2==1)ans=multi(ans,onc);
onc=multi(onc,onc);
p=p/2;
}
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
ans.x=1,ans.y=2;
ans.s[1][1]=x0,ans.s[1][2]=1;
onc.x=2,onc.y=2;
onc.s[1][1]=a,onc.s[1][2]=0,onc.s[2][1]=c,onc.s[2][2]=1;
quick_pow(n);
printf("%lld",ans.s[1][1]%g);
return 0;
}
就这样,谢谢啦