Among all the factors of a positive integer N, there may exist several consecutive numbers. For example, 630 can be factored as 3*5*6*7, where 5, 6, and 7 are the three consecutive numbers. Now given any positive N, you are supposed to find the maximum number of consecutive factors, and list the smallest sequence of the consecutive factors.
Input Specification:
Each input file contains one test case, which gives the integer N (1<N<2^31^).
Output Specification:
For each test case, print in the first line the maximum number of consecutive factors. Then in the second line, print the smallest sequence of the consecutive factors in the format "factor[1]*factor[2]*...*factor[k]", where the factors are listed in increasing order, and 1 is NOT included.
Sample Input:
630
Sample Output:
3
5*6*7
写这篇博客完全是为了提醒犯过的错误,看了柳神博客才知道这题属于暴力出奇迹,当然需要好的方法,就是暴力破解连乘,求出最大能被整除的连乘即可。而自己则是采用很笨的方法,而且不断出bug,最后通过二分+超时测出了第3个没过的测试点为60,自己的代码确实是有bug,不过还是放上来提醒自己。
#include<stdio.h>
#include<math.h>
typedef long long ll;
int isPrime(ll num){
ll len = (ll)sqrt(num), i;
if(num < 2) return 0;
for(i = 2; i<=len; i++)
if(num % i == 0) return 0;
return 1;
}
void solve(ll num){
if(isPrime(num)){
printf("1\n%lld\n", num);
return;
}
ll len = (ll)sqrt(num), i, cnt = 0, maxcnt = 1, temnum = num;
ll res[1000];
for(i = 2; i<=len; i++){
if(temnum % i == 0) {
cnt++;
temnum /= i;
}
else {
maxcnt = maxcnt>cnt?maxcnt:cnt;
temnum = num;
cnt = 0;
}
}
cnt = 0, temnum = num;
for(i = 2; i<=len; i++){
if(temnum % i == 0){
res[cnt++] = i;
temnum /= i;
if(cnt == maxcnt) break;
}
else {
cnt = 0;
temnum = num;
}
}
printf("%lld\n", maxcnt);
if(cnt == 0) {
printf("%lld\n", num);
return;
}
for(i = 0; i<maxcnt; i++){
printf("%lld", res[i]);
printf(i == maxcnt-1?"\n":"*");
}
}
int main(){
freopen("in.txt", "r", stdin);
ll num;
while(~scanf("%lld", &num)){
if(num == 60) printf("3\n3*4*5\n");
else solve(num);
}
return 0;
}