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 |
前面几个是10000In Reply To:谁能帮我测测呀,WA得不行了呀!!!! Posted by:ecjtubaowp at 2007-03-27 21:06:27 > //第一类环排列 > #include<stdio.h> > #include<math.h> > int a[10000],b[10000]; > int prime[100000],p0[10000],t[10000]; > int n,p; > int modn(int base,int pow)//计算base^pow(mod p) > { > int i,j,mod,sum; > __int64 m0; > mod=p; > m0=pow;i=0; > while(m0) > {a[i]=m0%2;i++;m0/=2; > } > m0=base;sum=1; > for(j=0;j<i;j++) > { > if(a[j])sum=(sum*m0)%mod; > m0=(m0*m0)%mod; > } > return sum; > } > int isprime(int n0) > { > int i;int m; > if(n0==1)return 0; > m=(int)sqrt((double)n0); > for(i=2;i<=m;i++) > if(n0%i==0)break; > if(i>m)return 1; > else return 0; > } > int main() > { > int i,j,k,save,fact,sum0,mat,k0,s; > int test; > int sum; > prime[1]=2;prime[2]=3;k=2; > for(i=5;i<=100000;i+=2) > { > for(j=1;prime[j]*prime[j]<=i;j++) > { > if(i%prime[j]==0)goto loop; > } > k++;prime[k]=i; > loop:; > } > prime[0]=k; > scanf("%d",&test); > while(test--) > { > scanf("%d%d",&n,&p); > if(n==1){printf("%d\n",1%p);continue;} > if(n==2){printf("%d\n",3%p);continue;} > k=0; > for(i=1;i*i<=n;i++)//计算n所有的因子 > {if(n%i==0) > { > k++;b[k]=i; > if(b[k]!=n/i){k++;b[k]=n/i;} > } > } > /*for(i=1;i<=k;i++) > printf("%d ",b[i]); > printf("\n"); > */ > //printf("%d\n",modn(4,1)); > fact=0; > for(i=1;i<=k;i++) > { mat=b[i]; > //if(b[i]==1)goto loop; > if(isprime(b[i]))sum0=b[i]-1; > else > { > k0=0; > for(j=1;j<=prime[0];j++) > { > s=0; > while(b[i]%prime[j]==0){s++;b[i]/=prime[j];} > if(s>0){k0++;p0[k0]=prime[j];t[k0]=s;} > if(b[i]==1)break; > if(b[i]/prime[j]<prime[j]){k0++;p0[k0]=b[i];t[k0]=1;break;} > }//for > sum0=mat; > for(j=1;j<=k0;j++) > sum0=(sum0/p0[j]*(p0[j]-1))%p; > }//else > //printf("%d\n",sum0); > fact=(fact+sum0*modn(n,n/mat-1))%p; > //printf("%d\n",fact); > }//for > printf("%d\n",fact%p); > }//while > }//main > /* > 63 > 1000000000 30000 > 16000 > 100000000 30000 > 16000 > 10000000 30000 > 16000 > 1000000 30000 > 16000 > 100000 30000 > 16000 > 10000 30000 > 4000 > 1000 30000 > 400 > 100 30000 > 12040 > 10 30000 > 20044 > 1 30000 > 1 > */ > Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator