zoukankan      html  css  js  c++  java
  • timus 1748 The Most Complex Number zoj 2562 More Divisors

    /*
    * timus1748.c
    *
    * Created on: 2011-10-6
    * Author: bjfuwangzhu
    */
    /*
    这里面我们有一个prime【16】的数组,为什么只要这几个素数呢,因为这几个素数的乘积大于10^16,
    而且就反素数的性质来说
    比如2^t1*3^t2*5^t3*...p1^x***p2^y,假设p1是大于prime[]中所有的素数的,
    因为这几个素数的乘积大于10^16,如果
    我们添加p1在这个连乘积式子里面,那么必然有至少一个prime[i]不在这个连乘积式子里面,
    但是对于因子的总数目而言
    我们在乎的是幂的大小,而非素因子的大小,也就是说如果素因子越大,反而会使因子的数目偏小。
    这里引进反素数知识:
    反素数第一点:g(x)表示 x含有因子的数目,设 0<i<=x 则g(i)<=x;
    反素数第二个特性:2^t1*3^t2^5^t3*7^t4..... 这里有 t1>=t2>=t3>=t4...
    证明:如果ti<tj,其中i<j,由于pi小于pj,那么pi^tj*pj^ti<pi^ti*pj^tj,这样就出现了
    因子数目相同,但x更小的情况,与反素数的定义矛盾。
    */

    #include<stdio.h>
    #define LLU unsigned long long
    #define pnum 17
    int prime[pnum] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
    59 };
    LLU n, nmin;
    int nmax;
    void dfs(int pstart, int limit, LLU now, int nnum) {
    int i;
    LLU p = prime[pstart];
    double nnow;
    if (now > n) {
    return;
    }
    if (nnum > nmax) {
    nmin = now;
    nmax = nnum;
    }
    if (nnum == nmax && now < nmin) {
    nmin = now;
    }
    for (i = 1; i <= limit; p *= prime[pstart], i++) {
    nnow = (double) now;
    if (nnow * p > n) {
    break;
    } else {
    dfs(pstart + 1, i, now * p, nnum * (i + 1));
    }
    }
    }
    int main() {
    #ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
    #endif
    int t;
    while (~scanf("%d", &t)) {
    while (t--) {
    scanf("%llu", &n);
    nmin = 1, nmax = 1;
    dfs(0, 60, 1, 1);
    printf("%llu %d\n", nmin, nmax);
    }
    }
    return 0;
    }

  • 相关阅读:
    7月6日实习日志
    7月5日实习日志
    7月4日实习日志
    emacs设置tab缩进
    {{badmatch, {error, eexist}}
    windows下使用emacs+plink远程编辑erlang文件
    cowboy跨域请求处理
    erlang的base64解码问题
    Erlang-VM节点启动名冲突问题
    laya在微信小游戏中加载BitmapFont失效的问题
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/2199896.html
Copyright © 2011-2022 走看看