您的位置:首页 > 其它

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

2011-09-04 22:53 477 查看
这题是用来求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;
}
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: