百度之星2013 偉隨機數生成器

貌似沒有通過,不會寫,真的不會寫

伪随机数生成器

题目描述

 baidu熊最近在学习随机算法,于是他决定自己做一个随机数生成器。

这个随机数生成器通过三个参数c, q, n作为种子, 然后它就可以通过以下方式生成伪随机数序列:

m0c,

mi+1= (q2mi + 1) mod 2n,    for all i >= 0.

 

因为一些奇怪的原因,q 一定是奇数。现在du熊想知道对于一个给定的数 x ,是不是会出现在这个伪随机数序列里面,如果存在的话,他还想知道最早是在哪里出现,即给定一个整数 x ,要求找出一个最小的整数 k 满足 mkx.

输入格式

输入包含多组数据。

每个测试数据包含一行三个整数: 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;
}

转载于:https://my.oschina.net/dianpaopao/blog/118971

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值