L1-006 连续因子(有技巧的简单枚举)

L1-006 连续因子(有技巧的简单枚举)

题解:
先摆几个数据:L1-006 连续因子(有技巧的简单枚举)
-----(2<<31)=2147483648;
-----sqrt(2<<31)=46341;
-----8!=40320
-----9!=362880
-----12!<(2<<31)<13!


L1-006 连续因子(有技巧的简单枚举)
既然木有任何思路,那我们就想枚举把.emm好吧,我想上我超级无敌沙雕的表情包了啊啊啊
继续看题。题目要求是求出最长的连续因子中最小的。那就先枚举长度,再枚举起点,假如找到了的话直接跳出双重循环就OK;

#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
    int n;scanf("%d",&n);
    int mid=sqrt(n),dexl,dexs,fflag=0;
    for(int len=12;len>=1;len--)//长度,len要从12开始(13!,因子1不计),这里不可以按mid的几的阶乘算啊啊
    {
        int flag=0;
        for(int sta=2;sta<=mid;sta++)//起点
        {
            ll k=1;
            int tmp=sta;
            while(k<n)//超过k
            {
                k*=(ll)tmp;//这里可能溢出!!!!一定要注意啊,k十分接近于n时再成一个数可能溢出
                ++tmp;
                if((tmp-sta)==len)//超过长度
                    break;
            }
            if((tmp-sta)==len&&n%k==0)
            {
                flag=1;
                dexs=sta;//起始点
                break;
            }
        }
        if(flag)
        {
            fflag=1;
            dexl=len;//答案的长度
            break;
        }
    }
    if(fflag)
    {
        printf("%d\n%d",dexl,dexs);
        int end_=dexs+dexl-1;
        while((++dexs)<=end_)
            printf("*%d",dexs);
    }
    else
        printf("1\n%d",n);
}