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\n\n");
            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\n",len1);
            printf("%d",qidian);
            for(i=1;i<len1;i++){
                printf("*%d",qidian+i);
            }
            printf("\n");
            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\n");
            printf("%d",qidian);
            for(i=1;i<3;i++){
                printf("*%d",qidian+i);
            }
            printf("\n");
            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\n");
            printf("%d*%d\n",qidian,qidian+1);
            continue;
        }



        printf("1\n");
        int flag=0;
        for(i=2;i<=sqrt(n);i++){
            if(n%i==0){
                flag=1;printf("%d\n",i);
                break;
            }
        }
        if(flag){
            continue;
        }
        else printf("%d\n",n);
    }
    return 0;
}


posted @ 2015-11-30 11:34  Herumw  阅读(103)  评论(0编辑  收藏  举报