BZOJ2875&&洛谷P2044 [NOI2012]随机数生成器

版权声明:我这么弱的蒟蒻,虽然博文不是很好,但也请标明转发地址喵! https://blog.csdn.net/ACerAndAKer/article/details/82177173

矩阵快速幂+快速乘法

不难构造出矩阵

|a  c|    |x0 0|                                                                                                                                                                                          |1  0|    |1  0|

然后就是在矩阵乘法的时候,需要用到快速乘法防止爆longlong,快速乘法类似于快速幂,自己意会

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
struct mtix
{
    lli x[2][2];
    mtix(){memset(x,0,sizeof(x));}
}f,g;
lli n,p,a,c,x0,mod;
inline lli gscf(lli x,lli y)
{
	lli ans=0;
	for (;y;x=(x<<1)%p,y>>=1)
	if (y&1) ans=(ans+x)%p;
	return ans;
}
inline mtix mul(mtix A,mtix B)
{
    mtix C;
    for (int i=0;i<2;i++)
    for (int j=0;j<2;j++)
    for (int k=0;k<2;k++)
    C.x[i][j]=(C.x[i][j]+gscf(A.x[i][k],B.x[k][j]))%p;
    return C;
}
inline mtix mpow(mtix b,lli y)
{
    mtix ans;ans.x[0][0]=ans.x[1][1]=1;
    for (;y;b=mul(b,b),y>>=1)
    if (y&1) ans=mul(ans,b);
    return mul(ans,g); 
}
signed main()
{
    cin>>p>>a>>c>>x0>>n>>mod;
    f.x[0][0]=a;f.x[0][1]=c;f.x[1][1]=1;
    g.x[0][0]=x0;g.x[1][0]=1;
    mtix ans=mpow(f,n);
    cout<<ans.x[0][0]%mod;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/82177173
今日推荐