• The Factor


    The Factor

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 1274    Accepted Submission(s): 403

    Problem Description
    There is a sequence of n positive integers. Fancycoder is addicted to learn their product, but this product may be extremely huge! However, it is lucky that FancyCoder only needs to find out one factor of this huge product: the smallest factor that contains more than 2 factors(including itself; i.e. 4 has 3 factors so that it is a qualified factor). You need to find it out and print it. As we know, there may be none of such factors; in this occasion, please print -1 instead. 
     
    Input
    The first line contains one integer T (1T15), which represents the number of testcases. 

    For each testcase, there are two lines:

    1. The first line contains one integer denoting the value of n (1n100).

    2. The second line contains n integers a1,,an (1a1,,an2×109), which denote these n positive integers. 
     
    Output
    Print T answers in T lines.
     
    Sample Input
    2
    3
    1 2 3
    5
    6 6 6 6 6
     
    Sample Output
    6 4
     
    Source

     题意:给一数组。求数列的乘积的最小的满足条件的因子,该因子含有两个以上因子(包括自身。

    解题思路:对数列中的每一个数,找出两个最小素数因子。然后对这些质数因子排序,最小的两个数乘积便是满足条件的因子。

    intention:数比较大,long long。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 #define N 100000 //N*N > 10的9次方。素数表在N 以内就行。 
     9 
    10 long long b[N], num[N];
    11 int cnt = 0;
    12 
    13 void prim()
    14 {
    15     int a[N] = {0};
    16     for(int i = 2; i < N; i++)
    17     {
    18         if(!a[i])
    19         {
    20             b[cnt++] = i;
    21             for(int j = i+i; j < N; j+=i)
    22                 a[j] = 1;
    23         }
    24     }
    25 }
    26 
    27 int main()
    28 {
    29     int t, n;
    30     long long d;
    31     prim();
    32     scanf("%d", &t);
    33     while(t--)
    34     {
    35         int k = 0;
    36 
    37         scanf("%d", &n);
    38         while(n--)
    39         {
    40             scanf("%I64d", &d);
    41             int q = 0;
    42             for(int i = 0; i < cnt && b[i]<=d && q < 2; i++)   // i<cnt ,如果i> cnt,然而b[i]还是比d小,就会出现除数是0的情况……
    43             {
    44                 while(d % b[i] == 0)
    45                 {
    46                     q++;
    47                     d /= b[i];
    48                     num[k++] = b[i];
    49                     if(q >= 2)
    50                         break;
    51                 }
    52             }
    53 
    54             if(d != 1)
    55                 num[k++] = d;   // 素数表在N范围内,数据范围内的素数超过N,so,剩下的d如果不是1的话,可能是超过N的素数,例如 两个素数乘积2*10016959=20033918.所以10016959要存数组num中
    56 
    57         }
    58         sort(num, num+k);
    59         if(k < 2)
    60             printf("-1
    ");
    61         else
    62             printf("%I64d
    ", num[0]*num[1]);
    63     }
    64     return 0;
    65 }

    思维严谨……

    让未来到来 让过去过去
  • 相关阅读:
    PHP数据类型
    Windows定时备份Mysql数据库
    Linux定时删除n天前日志
    使用file_get_contents() 发送GET、POST请求
    使用Git工具批量拉取代码
    Git常用命令
    点击开关按钮,通过改变类名切换按钮
    两个行内元素的间隙问题
    vue和angular双向数据绑定原理
    原生js实现 双向数据绑定
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4789042.html
Copyright © 2020-2023  润新知