L1-006 连续因子(有技巧的简单枚举)
题解:
先摆几个数据:
-----(2<<31)=2147483648;
-----sqrt(2<<31)=46341;
-----8!=40320
-----9!=362880
-----12!<(2<<31)<13!
既然木有任何思路,那我们就想枚举把.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);
}