貌似沒有通過,不會寫,真的不會寫
伪随机数生成器
题目描述
baidu熊最近在学习随机算法,于是他决定自己做一个随机数生成器。
这个随机数生成器通过三个参数c, q, n作为种子, 然后它就可以通过以下方式生成伪随机数序列:
m0= c,
mi+1= (q2mi + 1) mod 2n, for all i >= 0.
因为一些奇怪的原因,q 一定是奇数。现在du熊想知道对于一个给定的数 x ,是不是会出现在这个伪随机数序列里面,如果存在的话,他还想知道最早是在哪里出现,即给定一个整数 x ,要求找出一个最小的整数 k 满足 mk= x.
输入格式
输入包含多组数据。
每个测试数据包含一行三个整数: c, q, n, x.
数据满足0 <= c < 2n, 0 <= q2 < 263, 0 < n <= 63, 0 <= x < 263.
输入以文件结束符结尾。
输出格式
对应每个测试数据输出满足条件的k,如果x不会出现在序列里面的话,就输出-1。
样例输入
1 3 3 5
1 3 2 5
样例输出
4
-1
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int
main()
{ long long int k, flag, temp, ma, mb, c, q, n, N, x;
while(cin>>c>>q>>n>>x){
k=1;
flag=0;
ma=c;
N=pow(2, n);
mb=(q*q*ma+1)%N;
cout<<c<<"*"<<q<<"*"<<n<<"*"<<x<<"*"<<ma<<"*"<<mb<<"*"<<N<<endl;
while(1){
k++;
ma=mb;
mb=(q*q*ma+1)%N;
if(mb>x || ma==0)break;
if(mb==x){
flag=1;
break;
}
ma=temp;
cout<<"ma="<<ma<<"*mb="<<mb<<endl;
}
if(flag)cout<<k<<endl;
else cout<<-1<<endl;
}
return 0;
}