little difference

把一个数字分解成有限个相差不超过1的因子;
这里如果是2的n次幂就不可以,因为比如4,可以拆成 2,2,或者2,2,1,或者2,2,1,1,。。。所有这个不可以,没想到这个
数据是1E18,一开始想觉得都会TLE,但是其实如果拆成2个数字,要相差不超过1,可能是根号n和根号n,或者根号n和根号n+1,因此只要把这个特判一下,之后分成三个数字,最大1E6,可以直接裸跑到1e6就可以找出答案了,每一次最多循环log(n)次,时间复杂度1e6*log(n),可以做;

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define si(a) a.size()
#define pb push_back
#define vi vector<int>
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define rep(i,a,n) for (ll i=a;i<n;i++)
#define per(i,a,n) for (ll i=a;i>=n;i--)
#define mm(x,b) memset((x),(b),sizeof(x))
#define scfff(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define de(a) cout << #a << " = " << a << endl
#define dd(a) cout << #a << " = " << a << " "
typedef long long ll;
using namespace std;
const double eps=1e-8;
const int N=2e6+2;
vector<long long > v[N];
int main()
{
	freopen("little.in","r",stdin);
	freopen("little.out","w",stdout);
	ll n;
	cin>>n;
	
	if(n==1||n==2)
	{
		cout<<"-1";
		return 0;
	}
	v[0].pb(1);
	v[0].pb(n);
	ll ttt=1;
	ll q=ll(sqrt(n));
	
	if(n%q==0)
	{
		if(abs(n/q-q)<=1)
		{
			v[ttt].pb(2);
			v[ttt].pb(q);
			v[ttt].pb(n/q);
			ttt++;
			//cout<<"2 "<<q<<" "<<n/q<<endl;
		}
	}
	rep(i,2,N)
	{
		ll qq=n;
		if(qq%i==0||qq%(i+1)==0)
		{
			ll bits1=0,bits2=0;
			while(qq%i==0) {
				bits1++;
				qq/=i;
			}
			while(qq%(i+1)==0)
			{
				bits2++;
				qq/=(i+1);
			}
			if(i==2&&bits2==0&&qq==1)
			{
				cout<<"-1";
				return 0;
			}
			if(qq==1&&(bits1+bits2)!=2&&(bits1+bits2)!=1)
			{
				
				v[ttt].pb(bits1+bits2);
				//cout<<bits1+bits2;
				rep(j,0,bits1)
				v[ttt].pb(i);
			//	pf(" %d",i);
				rep(j,0,bits2)
				v[ttt].pb(i+1);
			//	pf(" %d",i+1);
				if(bits1==0)
				i++;
				ttt++;
			}
		}
	}
	cout<<ttt<<endl;
	rep(i,0,ttt)
	{
		ll len=si(v[i]);
		cout<<v[i][0];
		
		rep(j,1,len)0
		{
			pf(" %lld",v[i][j]);
		}
		cout<<endl;
	}
	return 0;
}

posted @ 2019-05-04 18:28  一无所知小白龙  阅读(268)  评论(0)    收藏  举报