0
点赞
收藏
分享

微信扫一扫

Raspberry系统管理 —— 安装和配置OpenVINO

题目描述

栋栋最近迷上了随机算法,而随机数是生成随机算法的基础。栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数 m,a,c,X0​,按照下面的公式生成出一系列随机数{Xn​}:

Xn+1​=(a*Xn​ + c )mod m

其中  mod m 表示前面的数除以 m 的余数。从这个式子可以看出,这个序列的下一个数总是由上一个数生成的。

用这种方法生成的序列具有随机序列的性质,因此这种方法被广泛地使用,包括常用的 C++ 和 Pascal 的产生随机数的库函数使用的也是这种方法。

栋栋知道这样产生的序列具有良好的随机性,不过心急的他仍然想尽快知道 Xn​ 是多少。由于栋栋需要的随机数是 0,1,…,g−1 之间的,他需要将 Xn​ 除以 g 取余得到他想要的数,即 Xn ​mod g,你只需要告诉栋栋他想要的数  Xn​ mod g 是多少就可以了。

输入格式

一行 6 个用空格分割的整数 m,a,c,X0​,n 和 g,其中 a,c,X0​ 是非负整数,m,n,g 是正整数。

输出格式

输出一个数,即Xn​ mod g。

输入输出样例

输入 #1复制

11 8 7 1 5 3

输出 #1复制

2

说明/提示

计算得 Xn ​= X5 ​=8,故(Xn​ mod g)=(8 mod 3)=2。

对于 100% 的数据,n,m,a,c,X0​  ≤ 10^18,1 ≤ g ≤ 10^8,n,m≥1,a,c,X0 ​≥ 0。

初始矩阵 {  Xn   }

               {   c     }

Xi​=a*Xi−1​+1×c

c=0×Xi−1+1×c

so 

转移矩阵  [a     0]​

                [1     1​]

乘法会爆long long,so  来个龟速乘

then AC;

#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define  endl '\n'
#define lowbit(x) ((x)&-(x))
const int N=2e6+10;
typedef long long ll;
ll ans=0,n1,m1;
ll t=0,s1=0,s2=0,s3=0,s4=0,max1=0,max2=0,w,min1=100000000,sum=0,n,m,i,j,k,v,l,r;

inline int read() {
	bool sym=0;
	int res=0;
	char ch=getchar();
	while(!isdigit(ch))sym |=(ch =='-'),ch=getchar();
	while(isdigit(ch)) res =(res<<3)+(res<<1)+(ch^48),ch=getchar();
	return sym ? -res : res;
}
void print(int x) {
	if(!x)return;
	print(x/10);
	putchar(x%10+'0');
}
 ll LowP(ll x,ll y){
	ll res=0;
	while(y!=0){
		if(y&1)res=(res+x)%m;
        y>>=1;x=(x<<1)%m;
	}
	return res;
}
ll a,c,x,g; 

struct mm{
	ll m[107][108];
}as,ass,ax;
mm operator *(const mm&a,const mm&b){
	mm c;
	memset(c.m ,0,sizeof c.m );
	for(ll i=1;i<=2;i++)
	{
		for(ll j=1;j<=2;j++){
			for(ll k=1;k<=2;k++)
			{
				c.m [i][j]=(c.m [i][j]+LowP(a.m[i][k],b.m[k][j]))%m;
				//c.m [i][j]%=g;
			}
		}
	}
	
	return c;
	
}

mm qmm(mm a,ll k){
	mm ans;
	memset(ans.m ,0,sizeof ans.m );
	for(ll i=1;i<=2;i++)
	{
		ans.m [i][i]=1;
	}
	while(k)
	{
		if(k&1)
		ans=ans*a;
		a=a*a;
		k>>=1;
	}
	
	
	
	return ans;
}

int main() {


	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>m>>a>>c>>x>>n>>g;
	as.m [1][1]=a;
	as.m [1][2]=1;
	as.m [2][1]=0;
	as.m [2][2]=1;
	ax.m[1][1]=x;
	ax.m[2][1]=c;
	ass=qmm(as,n);
	ass=ass*ax;
	/*for(i=1;i<=2;i++)
	{
		for(j=1;j<=2;j++)
		{
			cout<<ass.m [i][j]<<' ';
		}
		cout<<endl;
	}*/
	 cout<<ass.m [1][1]%g;
	 

	return 0;
}

//mio lover
举报

相关推荐

0 条评论