描述
题解
最开始看错题了,结果想岔了,用尺取法做了,但是不是说尺取法不能做,只是没必要用它,直接用数组存起来所有的因子即可,当然,也可以存一部分因子,毕竟这个结果只和前部分因子以及它本身有关。
这里我用的尺取法,效率还算可以,但是系统有一个坑,明明说时间限制为400ms,可是10毫秒多一点儿就超时了,朋友说,大概这是玄学问题吧,于是我就又优化了一些,优化到了10ms,AC 了。
这里需要考虑到的是连续因子超过1的,那么用一个 while 循环就能搞定,但是还需要考虑到一些连续因子为1的情况,这时输出的结果分为两种,一种是他本身,还有一种是他最小的大于1的因子,其实,这就是一种情况,不过在搞事情时,出于优化,分为两种来弄还是比较好的。
代码
//
// main.cpp
// f-PAT-L1-006-连续因子
//
// Created by ZYJ on 2017/3/20.
// Copyright © 2017年 ZYJ. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
ll n, m;
ll head, tail;
ll ans, pro, temp;
ll ansHead, ansTail;
while (~scanf("%lld", &n))
{
m = sqrt(n) + 1;
head = ansHead = 2;
tail = ansTail = 3;
ans = 1;
pro = 6; // 2 * 3
int flag = 0;
while (head != tail)
{
if (tail > m)
{
break;
}
if (n % pro == 0)
{
flag = 1;
temp = tail - head + 1;
if (ans < temp)
{
ans = temp;
ansHead = head;
ansTail = tail;
}
}
else if (pro > n)
{
pro /= head;
head++;
continue;
}
tail++;
pro *= tail;
}
if (flag)
{
printf("%lld\n%lld", ans, ansHead);
for (ll i = ansHead + 1; i <= ansTail; i++)
{
printf("*%lld", i);
}
}
else
{
printf("1\n");
if (n & 1)
{
int tag = 1;
for (int i = 3; i < m; i += 2)
{
if (n % i == 0)
{
tag = 0;
printf("%d", i);
break;
}
}
if (tag)
{
printf("%lld", n);
}
}
else
{
printf("2");
}
}
puts("");
}
return 0;
}