Find the maximum/hdoj 4002 2011 Regional Dalian Online euler fuction

来源:互联网 发布:心蓝软件下载 编辑:程序博客网 时间:2024/05/16 15:55

       这题是用来求1到n间i/euler(i)最大值。可得x/(x(1-1/p1)(1-1/p2)(1-1/p3).....(1-1/pn))  (pi为x的质因数),则有p1*p2*p3....*pn/(1-p1)(1-p2)(1-p3)....(1-pn), p1/(1-p1)是单调递减的。可得n前的全部质数的积,求刚好比n小于等于的最大的积即可。从最小的质数开始乘,直到时刚好不大于n的数即为结果。

     打表即可!



 

import java.io.*;import java.util.*;import java.math.*;import java.math.BigInteger;public class hdoj4002 {public static void main(String[] args){ //////////////////////// final int MAXN=300; int[] prime=new int[MAXN+10]; int[] allprime=new int[MAXN]; int i; int j; int sub=0; prime[0]=1; prime[1]=1; for(i=2;i<=MAXN;i++) { if(prime[i]==0) { allprime[sub++]=i; for(j=i+i;j<=MAXN;j+=i) { prime[j]=1;  }  }  }  /////////////////////////////////store all the prime into the array allprime. BigInteger[] ans=new BigInteger[60];BigInteger flag=new BigInteger("2");ans[0]=BigInteger.valueOf(allprime[0]); for(i=1;i<60;i++) {    ans[i]=ans[i-1].multiply(BigInteger.valueOf(allprime[i]));      }//store the prime product in a table Scanner cin=new Scanner(System.in); int n; BigInteger num; n=cin.nextInt(); while(n>0) { n--; num=cin.nextBigInteger(); for(i=0;i<60;i++) { if(num.compareTo(ans[i])==0) { System.out.println(ans[i]); break; } if(num.compareTo(ans[i])<0) {  System.out.println(ans[i-1]); break;   }  }  }}  }


原创粉丝点击