zoukankan      html  css  js  c++  java
  • 1006 逆袭指数

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1284    Accepted Submission(s): 221


    Problem Description
      这依然是关于高富帅小明曾经的故事——

      尽管身处逆境,但小明一直没有放弃努力,除了搬砖,小明还研究过东方的八卦以及西方的星座,一直试图在命理上找到自己能够逆袭的依据。

      当这些都失败以后,小明转向了数学研究,希望从中得到一些信息。一天,小明在研究《BestCoder逆袭的数理基础》这本书时,发现了宝贵的信息,其中写道:
      每个人都存在一个逆袭指数,对于这个逆袭指数,可能存在连续的因子,如果这个连续因子足够长的话,那么这个人逆袭的概率就很大!

      小明已知自己的逆袭指数,请告诉小明他最长的连续因子,以让他来判断他自己是否能够逆袭。
     

    Input
    输入包含多组测试数据。
    每组数据占一行,包含一个整数N,表示小明的逆袭指数,N小于2^31。
     

    Output
    对于每组数据,请输出2行:
    第一行输出最长的因子个数;
    第二行输出最小的因子序列,具体请参考样例。

    特别说明:由于小明十分讨厌单身,所以1不算因子。
     

    Sample Input
    630 12
     

    Sample Output
    3 5*6*7 2 2*3
    Hint
    630 = 3*5*6*7
     
    这题题意没有说清楚,如果一个数有多个相同的长度的连续因数,那么输出因数的时候要输出最小的,不然会wa= =


    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    #define inf 0x7fffffff
    int a[12][300][2];
    int geshu[20];
    int b[50000][2];
    int c[2000][2];
    
    void init()
    {
        int i,j;
        ll len;
        memset(geshu,0,sizeof(geshu));
        for(len=4;len<=12;len++){
            for(i=2;i<=500;i++){
                ll num=i;
                for(j=1;j<=len-1;j++){
                    num*=(i+j);
                }
                if(num>inf){
                    break;
                }
                geshu[len]++;
                a[len][geshu[len] ][0]=num;
                a[len][geshu[len] ][1]=i;
            }
    
    
        }
    
    }
    
    void init3()
    {
        int i,j;
        for(i=2;i<=1500;i++){
            ll num=i*(i+1)*(i+2);
            if(num>inf){
                break;
            }
            geshu[3]++;
            c[geshu[3] ][0]=num;
            c[geshu[3] ][1]=i;
        }
    
    
    }
    
    void init2()
    {
        int i,j;
        for(i=2;i<=47000;i++){
            ll num=i*(i+1);
            if(num>inf){
                break;
            }
            geshu[2]++;
            b[geshu[2] ][0]=num;
            b[geshu[2] ][1]=i;
        }
    }
    
    
    
    int main()
    {
        int n,m,i,j,qidian,len1,len;
        init();
        init2();
        init3();
        while(scanf("%d",&n)!=EOF)
        {
            if(n<=1){
                printf("0
    
    ");
                continue;
            }
            qidian=0;
            len1=0;
            for(len=11;len>=4;len--){
                for(i=1;i<=geshu[len];i++){
                    if(n>=a[len][i][0] && n%a[len][i][0]==0){
                        len1=len;
                        qidian=a[len][i][1];
                        break;
                    }
                }
                if(len1)break;
            }
            if(len1){
                printf("%d
    ",len1);
                printf("%d",qidian);
                for(i=1;i<len1;i++){
                    printf("*%d",qidian+i);
                }
                printf("
    ");
                continue;
    
            }
    
            qidian=0;
            len1=0;
            for(i=1;i<=geshu[3];i++){
                if(n>=c[i][0] && n%c[i][0]==0){
                    len1=3;
                    qidian=c[i][1];
                    break;
                }
            }
            if(len1==3){
                printf("3
    ");
                printf("%d",qidian);
                for(i=1;i<3;i++){
                    printf("*%d",qidian+i);
                }
                printf("
    ");
                continue;
            }
    
            qidian=0;
            len1=0;
            for(i=1;i<=geshu[2];i++){
                if(n>=b[i][0] && n%b[i][0]==0){
                    len1=2;
                    qidian=b[i][1];
                    break;
                }
            }
            if(len1==2){
                printf("2
    ");
                printf("%d*%d
    ",qidian,qidian+1);
                continue;
            }
    
    
    
            printf("1
    ");
            int flag=0;
            for(i=2;i<=sqrt(n);i++){
                if(n%i==0){
                    flag=1;printf("%d
    ",i);
                    break;
                }
            }
            if(flag){
                continue;
            }
            else printf("%d
    ",n);
        }
        return 0;
    }


  • 相关阅读:
    呵呵
    数据类型转换方法
    工业设计三原则
    C#实现的根据年月日计算星期几的函数
    网页设计的12种颜色
    SqlParameter 存储过程
    HTTP 状态响应码
    Android获取屏幕高度和宽度
    Android屏幕自适应解决方案
    Nodejs学习笔记nodejs的安装
  • 原文地址:https://www.cnblogs.com/herumw/p/9464609.html
Copyright © 2011-2022 走看看