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;
}
上一篇:以周计算日期差异(Javascript)


下一篇:python学习(集合)