zoukankan      html  css  js  c++  java
  • SPOJ AMR11E

    Arithmancy is Draco Malfoy's favorite subject, but what spoils it for him is that Hermione Granger is in his class, and she is better than him at it. Prime numbers are of mystical importance in Arithmancy, and Lucky Numbers even more so. Lucky Numbers are those positive integers that have at least three distinct prime factors; 30 and 42 are the first two. Malfoy's teacher has given them a positive integer n, and has asked them to find the n-th lucky number. Malfoy would like to beat Hermione at this exercise, so although he is an evil git, please help him, just this once. After all, the know-it-all Hermione does need a lesson.

    Input

    The first line contains the number of test cases T. Each of the next T lines contains one integer n.

    Output

    Output T lines, containing the corresponding lucky number for that test case.

    Constraints

    1 <= T <= 20
    1 <= n <= 1000

    Example

    Sample Input:
    2
    1
    2
    
    Sample Output:
    30
    42
    题意:求第n个三个以上不同的素数相乘的值(从小到大排),但是只要求三个不同的,也就意味着第五个第六个可以是相同的,如果只是暴力打表求三个不同素数的值,那会漏了很多情况,比如第三个应该是2*3*5*2=60.

    思路:枚举从30-10000个数,进行分解质因数,如果能分解出三个以上,则将该数字存到另一个数组,一开始想破脑袋都没想出来,后来看了一下数据范围和通过人数,就知道应该是暴力求解,果然没超时!

    代码:
     1 #include<iostream>
     2 #include<cmath>
     3 #include<algorithm>
     4 using namespace std;
     5 int a[11000];
     6 int ss(int n)//分解质因数
     7 {
     8     int q,w,e,c=0;
     9     int t=n;
    10     for(int i=2;i<=n;i++)
    11     {
    12         if(n%i==0)//如果i为因数就+1
    13         c++;
    14         while(n%i==0)//去掉重复的因数
    15         {
    16             n/=i;
    17         }
    18         if(n==1)
    19         break;
    20     }
    21     if(c>=3)//如果质因数大于等于3则说明该数字符合条件
    22     return 1;
    23     else
    24     return 0;
    25 }
    26 int main()
    27 {
    28     int m=0,c=0;
    29     long long ans[11000];
    30     for(int i=30;i<=10000;i++)//应该第一个样例告诉了你开头是30,所以直接从30枚举。
    31     {
    32         if(ss(i))
    33         a[c++]=i;//保存在数组里,方便直接输出。
    34     }
    35     int t,n;
    36     cin>>t;
    37     while(t--)
    38     {
    39         cin>>n;
    40         cout<<a[n-1]<<endl;//因为数从小到大枚举所以直接就可以输出
    41     }
    42     return 0;
    43 }
     
  • 相关阅读:
    Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
    Cogs 376. [IOI2002]任务安排(后效性DP)
    Bzoj 1911: [Apio2010]特别行动队(斜率优化)
    Poj 2018 Best Cow Fences(分数规划+DP&&斜率优化)
    Bzoj 1212: [HNOI2004]L语言(AC自动机+DP)
    ZOJ 3228 Searching the String(AC自动机)
    Bzoj 3172: [Tjoi2013]单词(fail树)
    Hdu 3065 病毒侵袭持续中(AC自动机)
    Hdu 2896 病毒侵袭(AC自动机)
    Bzoj 2599: [IOI2011]Race(点分治)
  • 原文地址:https://www.cnblogs.com/spongeb0b/p/9287267.html
Copyright © 2011-2022 走看看