zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    <LinkedList> 61
    <LinkedList> (hard + 高)25
    <DP> (高频)322
    <BackTracking> (dfs hard) 291
    <Tree> (高频)236
    <Math> 29 365
    <String> 161 358
    <Array> 309 (高)334
    <Array> 54 (高频+hard )45
    <Design> 359 346
  • 原文地址:https://www.cnblogs.com/wzl19981116/p/10809293.html
Copyright © 2011-2022 走看看