poj2381(Random Gap)

来源:互联网 发布:石家庄创客儿童编程 编辑:程序博客网 时间:2024/05/01 20:15

       题目链接:http://poj.org/problem?id=2381

        分析:R应该是一个递增循环序列,所以只需要求出一次循环的序列即可,一下代码巧妙的利用了R递增这一特性,所以flag[]数组即有标记作用,又起到了存放R的作用,如果另外再开一个这么的大的数组的话,该题将会超内存,不知道有没有更好的利用空间的解法,求指导!

代码:

#include<stdio.h>#include<string.h>int flag[16000005];int max=0;int main(){    int i,j;int a,c,m,R;memset(flag,0,sizeof(flag));scanf("%d%d%d%d",&a,&c,&m,&R);flag[R]=1;while(1){R=(a*R+c)%m;if(flag[R])break;flag[R]=1;}for(i=0;i<m;i++)if(flag[i])break;for(j=i+1;j<m;j++){if(flag[j]){if(j-i > max)max = j-i;i=j;}}printf("%d\n",max);return 0;}

原创粉丝点击