zoukankan      html  css  js  c++  java
  • UVA 350 Pseudo-Random Numbers 伪随机数(简单)

    题意:给定Z, I, M,  L,根据随机数产生式k=(Z*L+I)%M。但是L表示的是上一个产生的数,比如根据产生式产生了序列{2,5,4,3}那么5是由L=2算来的,4由L=5算来的..第1个所产生的数所需的L由系统给定。那么肯定会产生一个环,到某个位置就会开始产生重复的序列,比如12345345345...。求循环中有多少个数(循环节)?(如例是3,分别是345)

    思路:因为z i m 都是不变的,当L一定,那么产生的数肯定是一定的,所以只要L有重复出现,那就会从那里开始循环。标记一下所产生的数字再第几个开始产生,一旦产生重复就可以计算其循环节多长。

     1 #include <bits/stdc++.h>
     2 #define LL long long
     3 using namespace std;
     4 const int N=10005;
     5 bool ans[N];
     6 int num[N];
     7 int main()
     8 {
     9     //freopen("input.txt", "r", stdin);
    10     int z, i, m, l, j=0;
    11     while(~scanf("%d%d%d%d",&z,&i,&m,&l))
    12     {
    13         if(!z && !i && !m && !l )    break;//结束
    14         memset(ans,0,sizeof(ans));
    15         memset(num,0,sizeof(num));
    16 
    17         int cur=l, cnt=1;
    18         ans[cur]=true;
    19         num[cur]=1;
    20         while(1)
    21         {
    22             cur=(z*cur+i)%m;
    23             if(ans[cur])//已经出现过了
    24             {
    25                 printf("Case %d: %d
    ",++j,cnt-num[cur]+1);
    26                 break;
    27             }
    28             ans[cur]=1;//标记已经出现过
    29             num[cur]=++cnt;//在第几步出现过
    30         }
    31     }
    32     return 0;
    33 }
    AC代码
  • 相关阅读:
    5月27日
    5月26日
    5月25日
    5月24日
    5月22日
    梦断代码(3)
    01团队冲刺
    07周总结
    06周总结
    构建之法阅读笔记
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4606372.html
Copyright © 2011-2022 走看看