这题一开始毫无头绪,又可以分离,又要连续,其实不需要去考虑前面的有无,根本没关系,只需要对每一个点去找连续的就可以了。
但是傻傻的枚举更是不可靠的,那样必然会TLE,由于不可能大于sqrt(n),所以枚举范围可以改一下。
然后找连续就用while取余数就可以
while(val%pos==0){
c++;
val /= pos;
pos++;
}
if(c>maxx){
maxx = c;
start = i;
}
我也不知道为啥,但确实可以
#include <iostream>
#include <string.h>
#include <cmath>
#include <stdio.h>
#include <algorithm>
#define int long long
using namespace std;
const int N = 1e5+10;
int n;
int isPrime(int x)
{
if(x==1)
return false;
else
for(int i=2;i <= x / i;i++)
if(x%i==0)
return false;
return true;
}
signed main() {
cin>>n;
int c=0;
int maxx=0;
int start=0;
if(isPrime(n)){
printf("1\n%lld",n);
}else{
for(int i=2;i<=sqrt(n);i++)
{
// 对每一个位置进行枚举
int val = n;
int pos = i;
c = 0;
while(val%pos==0){
c++;
val /= pos;
pos++;
}
if(c>maxx){
maxx = c;
start = i;
}
}
// cout<<start<<" "<<c<<endl;
printf("%lld\n",maxx);
for(int i=start;i<=start+maxx-1;i++)
{
if(i==start){
printf("%lld",i);
}
else{
printf("*%lld",i);
}
}
}
return 0;
}
|