您的位置:首页 > 其它

HDU 4002 数论

2017-09-20 23:15 169 查看
题解:

设n=∏ni=1paii

则ϕ(n)=∏ni=1paii(1−1pi)

nϕ(n)=∏ni=11+1pi−1

因为对于两个不同质数a,b(a < b)

1a−1>1b−1

所以要使nϕ(n)最大,

就要让n尽可能有多的质因子(从小到大), 质因子指数为

所以打出10^100以内质因子”阶乘”表, 二分查找即可, 用java大整数实现

code:

import java.io.*;
import java.util.*;
import java.math.*;

public class Main {
static Scanner cin;
static BigDecimal two;
static BigDecimal f1;
static BigInteger[] p = new BigInteger[401];
static int[] pr = new int[401];
static boolean[] jz = new boolean[10010];
static int cnt = 0;
static void init()
{
Arrays.fill(jz, true);
jz[1] = false;
for(int i = 2;;++i)
{
if(jz[i])
{
pr[++cnt] = i;
if(cnt == 400) break;
}
for(int j = 1; j <= cnt; ++j)
{
if(i * pr[j] > 10000) break;
jz[i * pr[j]] = false;
if(i % pr[j] == 0) break;
}
}
p[0] = BigInteger.ONE;
for(int i = 1; i <= 400; ++i)
p[i] = p[i - 1].multiply(BigInteger.valueOf(pr[i]));
}
public static void main(String[] args) {
cin = new Scanner(new BufferedInputStream(System.in));
init();
int T = cin.nextInt();
for(int kas = 0; kas < T; ++kas)
{
BigInteger n = cin.nextBigInteger();
int l = 1, r = 400;
while(r - l > 1)
{
int m = (l + r) >> 1;
if(p[m].compareTo(n) == 1) r = m;
else l = m;
}
System.out.println(p[l]);
}
cin.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  phi 数论 hdu 欧拉函数