zoukankan      html  css  js  c++  java
  • False Ordering(统计因子个数、素因子分解)

    False Ordering
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

    Description

    We define b is a Divisor of a number a if a is divisible by b. So, the divisors of 12 are 1, 2, 3, 4, 6, 12. So, 12 has 6 divisors.

    Now you have to order all the integers from 1 to 1000. x will come before y if

    1)                  number of divisors of x is less than number of divisors of y

    2)                  number of divisors of x is equal to number of divisors of y and x > y.

    Input

    Input starts with an integer T (≤ 1005), denoting the number of test cases.

    Each case contains an integer n (1 ≤ n ≤ 1000).

    Output

    For each case, print the case number and the nth number after ordering.

    Sample Input

    5

    1

    2

    3

    4

    1000

    Sample Output

    Case 1: 1

    Case 2: 997

    Case 3: 991

    Case 4: 983

    Case 5: 840

     统计一个整数n的因子个数的方法:将n进行素因子分解,n=(q1^r1)*(q2^r2)*...*(qi^ri),则n的因子数为(r1+1)*(r2+1)*...*(ri+1).

    因为对于每个q,其对应的指数为r,q可取0个,1个,...,r-1个。

    AC Code:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 int dr[1001], num[1001];  //dr[i]是i的因子个数,num[i] = i
     8 int d[500], di = 0;
     9 bool p[1001];
    10 
    11 bool cmp(const int& a, const int& b)
    12 {
    13     if(dr[a] != dr[b]) return dr[a] < dr[b];
    14     return  a > b;
    15 }
    16 
    17 void Init_Prime()
    18 {
    19     memset(p, 0, sizeof(p));
    20     p[1] = 1;
    21     for(int i = 2; i < 1001; i++)
    22     {
    23         if(!p[i])
    24         {
    25             d[di++] = i;
    26             for(int j = 2; j * i < 1001; j++)
    27                 p[i*j] = 1;
    28         }
    29     }
    30     //for(int i = 0; i < di; i++) cout << d[i] << ' ';
    31     return ;
    32 }
    33 
    34 void Cal(int x)
    35 {
    36     int t = x;
    37     int sum = 1, cnt;
    38     for(int i = 0; d[i] <= t / 2 && i < di; i++)
    39     {
    40         cnt = 0;
    41         while(x % d[i] == 0)
    42         {
    43             cnt++;
    44             x /= d[i];
    45         }
    46         sum *= (cnt + 1);
    47     }
    48     if(!p[t]) sum *= 2;
    49     dr[t] = sum;
    50     return ;
    51 }
    52 
    53 int main()
    54 {
    55     int t, n, ca = 1;
    56     scanf("%d", &t);
    57     Init_Prime();
    58     for(int i = 1; i < 1001; i++)
    59     {
    60         num[i] = i;
    61         Cal(i);
    62     }
    63     //for(int i = 1; i < 30; i++) cout << i << ' ' << dr[i] << endl;
    64     sort(num + 1, num + 1001, cmp);
    65     while(t--)
    66     {
    67         scanf("%d", &n);
    68         printf("Case %d: %d\n", ca++, num[n]);
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    java面向对象4-多态
    机器学习降维--SVD奇异值分解
    hive中的null
    熵(二)-交叉熵与相对熵
    指数家族-Beta分布
    指数族函数
    java面向对象3-继承(继承、抽象类、抽象接口)
    网页自动刷新
    spring +hibernate 启动优化【转】
    svn is already locked解决方案
  • 原文地址:https://www.cnblogs.com/cszlg/p/2996560.html
Copyright © 2011-2022 走看看