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:
设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(); } }
相关文章推荐
- HDU 4002 Find the maximum(数论-欧拉函数)
- HDU 4002 Find the maximum(数论-欧拉函数)
- hdu 4002 数论 打表找规律 Find the maximum
- hdu 4002 Find the maximum——数论
- hdu 2588 搞了好久的数论题 1到n的数与n的公约数大于m的数的个数
- HDU 4651 数论 partition 求自然数的拆分数
- hdu 2608 0 or 1(数论推理)
- HDU 1852 Beijing 2008 数论
- HDU-2608 0 or 1 数论题
- hdu 5528 Count a * b 2015长春区域赛 数论 分析
- HDU 1397 POJ 2262 数论水题.
- hdu 4961 数论 o(nlogn)
- HDU 6069 数论 区间素数筛(+赛后反思
- HDU1395_2^x mod n = 1【数论】【水题】
- 【数论-莫比乌斯入门】hdu 1695 GCD
- hdu 5175 Misaki's Kiss again(数论)
- HDU 1695 GCD (数论-整数和素数,组合数学-容斥原理)
- HDU 3802 Ipad,IPhone 数论 矩阵乘法
- 【hdu - 3501 (数论、欧拉函数)】
- HDU 1271 数论,有点巧妙,改天再研究