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(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 条评论