| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
注意r2=(a*r1+c)%m;这里a*r1超过int范围了,再说你这样超内存的吧?In Reply To:Re:考虑溢出了没有? Posted by:miaomiaomiaomiao at 2006-08-24 14:07:53 > 我是找的循环节 思路对吗??标记一个pre[],一个back[],每次都把r1 r2和pre和back数组中找如果找到说明已经出现了一个循环,跳出即可,中间过程中已经找到了最大的差值了。对吗???
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> #include <math.h>
>
> unsigned pre[160000001];
> unsigned back[160000001];
> unsigned r1,r2;
> unsigned m,a,c,i;
> unsigned tail;
> unsigned maxdif;
> bool flag;
>
> int main(int argc, char *argv[])
> {
> while(scanf("%d %d %d %d",&a,&c,&m,&r1)!=EOF)
> {
> flag=0;
> tail=0;
> r2=(a*r1+c)%m;
> pre[tail]=r1;
> back[tail]=r2;
> tail++;
> maxdif=abs(r2-r1);
> if(r2==r1)
> {
> printf("0\n");
> continue;
> }
> while(1)
> {
> r1=r2;
> r2=(a*r1+c)%m;
> if(abs(r2-r1)>maxdif)
> maxdif=abs(r2-r1);
> for(i=0;i<tail;i++)
> {
> if(pre[i]==r1&&back[i]==r2)
> {
> flag=1;
> break;
> }
> }
> if(flag)
> break;
> pre[tail]=r1;
> back[tail]=r2;
> tail++;
> }
> printf("%d\n",maxdif);
> }
> return EXIT_SUCCESS;
> }
>
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator