BZOJ 2875 NOI2012 随机数生成器 矩阵乘法

本文介绍了一种快速解决矩阵乘法与取模问题的方法,通过使用快速乘法和矩阵运算来求解Xn%g的形式,避免了传统方法的冗长计算过程。该方法特别适用于大规模数据处理和高效率需求场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:令Xi+1=(a*Xi+c)%m,求Xn%g

水题。。。我们令x矩阵为

a 0

c 1

自乘n次,然后计算(aX0+c)%m%g即可

此题要写快速乘 不然会挂 我这个沙茶居然把矩阵开成了int 早知道多磕点脑残片了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
struct Martrix{
	ll martrix[2][2];
}x,ans;
ll m,a,c,x0,n,g;
ll ksc(ll X,ll Y)
{
	ll re=0;
	while(Y)
	{
		if(Y&1) re+=X,re=(re>m?re-m:re);
		X+=X,X=(X>m?X-m:X);
		Y>>=1;
	}
	return re;
}
void operator *= (Martrix &x,Martrix y)
{
	int i,j,k;
	Martrix z;
	memset(&z,0,sizeof z);
	for(i=0;i<2;i++)
		for(j=0;j<2;j++)
			for(k=0;k<2;k++)
				z.martrix[i][j]+=ksc(x.martrix[i][k],y.martrix[k][j]),z.martrix[i][j]=(z.martrix[i][j]>m?z.martrix[i][j]-m:z.martrix[i][j]);
	x=z;
}
void ksm()
{
	ans.martrix[0][0]=ans.martrix[1][1]=1;
	ans.martrix[1][0]=ans.martrix[0][1]=0;
	while(n)
	{
		if(n&1) ans*=x;
		x*=x;
		n>>=1;
	}
}
int main()
{
	
	freopen("random.in","r",stdin);
	freopen("random.out","w",stdout);
	
	cin>>m>>a>>c>>x0>>n>>g;
	x.martrix[0][0]=a%m;
	x.martrix[0][1]=0;
	x.martrix[1][0]=c%m;
	x.martrix[1][1]=1;
	ksm();
	ll xn=ksc(ans.martrix[0][0],x0)+ans.martrix[1][0];
	xn%=m;
	xn%=g;
	cout<<xn<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值