P2044 [NOI2012]随机数生成器

洛咕原题

正常的矩乘题。

但是,计算过程中会爆long long。

所以,我们要用快速(龟速)乘来解决。

快速乘,也就是把快速幂稍作修改。乘法被分成若干个加法,以时间为代价解决精度问题。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll; ll n,m,_a,c,g;
inline ll fastmul(ll x,ll y){ //快速乘
ll ans=;
for(;y;y>>=){
if(y&) ans=(ans+x)%m;
x=(x<<)%m;
}
return ans%m;
}
struct matrix{
ll a[][];
matrix(){memset(a,,sizeof(a));}
matrix operator * (matrix &tmp){
matrix c;
for(int i=;i<=;++i)
for(int j=;j<=;++j)
for(int k=;k<=;++k)
c.a[i][j]=(c.a[i][j]+fastmul(a[i][k],tmp.a[k][j]))%m;
return c;
}
matrix ksm(matrix x,ll y){
matrix ans;
ans.a[][]=ans.a[][]=;
for(;y;y>>=){
if(y&) ans=ans*x;
x=x*x;
}
return ans;
}
}p,st; int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&m,&_a,&c,&st.a[][],&n,&g);
p.a[][]=_a; p.a[][]=p.a[][]=; //构造初始矩阵
st.a[][]=c;
p=p.ksm(p,n);
st=st*p;
printf("%lld",st.a[][]%g);
return ;
}
上一篇:MFC 消息框


下一篇:NioEventLoop中的thread什么时候启动