QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#877783#4920. 挑战分解质因数JohnAlfnov0 121ms4224kbC++179.3kb2025-02-01 08:24:342025-02-01 08:24:34

Judging History

This is the latest submission verdict.

  • [2025-02-01 08:24:34]
  • Judged
  • Verdict: 0
  • Time: 121ms
  • Memory: 4224kb
  • [2025-02-01 08:24:34]
  • Submitted

answer

#ifndef __x86_64__
#error Only x86-64 targets are supported
#endif
#include<cstdint>
#include<vector>
#include<string>
#include<iosfwd>
#define __builtin_ia32_adc(x,y,flag) __asm__("addb   %3, %0\n\t" "adcq   %2, %1\n\t" "setc   %0":"+r"(flag),"+r"(x):"r"(y),"i"(-1):"cc")
#include<bits/stdc++.h>
struct bigint{// made by dengyaotriangle!
    typedef unsigned long long u64;
    typedef unsigned __int128 u128;
    typedef std::size_t st;
    std::vector<u64> data;
    bigint(){}
    bigint(u64 x):data(x?std::vector<u64>{x}:std::vector<u64>{}){}
    bigint(const std::string &s){
        st pos=s.length();
        int cnt=0;
        u64 val=0;
        while(pos){
            pos--;
            if(cnt==64){
                data.push_back(val);
                val=0;cnt=0;
            }
            val|=(u64)(s[pos]=='1')<<cnt;
            ++cnt;
        }
        if(cnt&&val)data.push_back(val);
    }
    explicit operator std::string()const{
        if(data.empty())return "0";
        bool t=0;
        std::string ret;
        for(int i=63;i>=0;i--){
            t|=(data.back()>>i)&1;
            if(t)ret+='0'|((data.back()>>i)&1);
        }
        st i=data.size()-1;
        while(i){
            i--;
            for(int j=63;j>=0;j--)ret+='0'|((data[i]>>j)&1);
        }
        return ret;
    }
    explicit operator bool()const{return !data.empty();}
    explicit operator u64()const{return data.empty()?0:data[0];}
    st digit()const{
        if(data.empty())return 0;
        return (data.size()<<6)-__builtin_clzll(data.back());
    }
    bool operator==(const bigint &a)const{return a.data==data;}
    bool operator!=(const bigint &a)const{return a.data!=data;}
    bool operator<(const bigint &a)const{
        if(data.size()!=a.data.size())return data.size()<a.data.size();
        for(st i=data.size();i;){
            i--;
            if(data[i]!=a.data[i])return data[i]<a.data[i];
        }
        return 0;
    }
    bool operator>(const bigint &a)const{return a<(*this);}
    bool operator<=(const bigint &a)const{return !(*this>a);}
    bool operator>=(const bigint &a)const{return !(*this<a);}
    bool operator&(int a){
    	return data[0]&a;
	}
    bigint &operator<<=(st n){
        if(data.empty())return *this;
        int w=n&63;st z=n>>6;
        st i=data.size();
        bool flg=0;
        if(w&&(data.back()>>(64-w)))data.push_back(0),flg=1;
        data.resize(data.size()+z);
        while(i){
            i--;
            if(flg)data[i+z+1]|=data[i]>>(64-w);
            data[i+z]=data[i]<<w;
            flg|=bool(w);
        }
        for(st i=0;i<z;i++)data[i]=0;
        return *this;
    }
    bigint &operator>>=(st n){
        int w=n&63;st z=n>>6,i=0;
        for(;i+z<data.size();i++){
            if(w&&i)data[i-1]|=data[i+z]<<(64-w);
            data[i]=data[i+z]>>w;
        }
        while(data.size()>i)data.pop_back();
        while(!data.empty()&&data.back()==0)data.pop_back();
        return *this;
    }
    bigint operator<<(st n)const{return bigint(*this)<<=n;}
    bigint operator>>(st n)const{return bigint(*this)>>=n;}
    bigint &operator+=(const bigint &a){
        data.resize(std::max(data.size(),a.data.size()));
        bool carry=0;
        for(st i=0;i<data.size();i++){
            u64 rg=0;
            if(i<a.data.size())rg=a.data[i];
            __builtin_ia32_adc(data[i],rg,carry);
        }
        if(carry)data.push_back(1);
        return *this;
    }
    bigint &operator-=(const bigint &a){
        bool carry=1;
        for(st i=0;i<data.size();i++){
            u64 rg=-1;
            if(i<a.data.size())rg=~a.data[i];
            __builtin_ia32_adc(data[i],rg,carry);
        }
        while(!data.empty()&&data.back()==0)data.pop_back();
        return *this;
    }
    bigint &operator++(){return *this+=bigint(1);}
    bigint &operator--(){return *this-=bigint(1);}
    bigint operator++(int){bigint tmp=*this;++*this;return tmp;}
    bigint operator--(int){bigint tmp=*this;--*this;return tmp;}
    bigint &operator*=(const bigint &a){
        std::vector<u64> ret(data.size()+a.data.size());
        for(st i=0;i<data.size();i++){
            u64 carry=0;bool wcarry=0;
            st k=i;
            for(st j=0;j<a.data.size();j++,k++){
                u128 r=data[i]*(u128)a.data[j]+carry;
                u64 cur=r;
                carry=r>>64;
                __builtin_ia32_adc(ret[k],cur,wcarry);
            }
            while(carry||wcarry){
                __builtin_ia32_adc(ret[k],carry,wcarry);
                carry=0;k++;
            }
        }
        while(!ret.empty()&&ret.back()==0)ret.pop_back();
        data=ret;
        return *this;
    }
    bigint &operator/=(const bigint &a){
        if(a.digit()>digit()){
            data.clear();
            return *this;
        }
        st z=digit()-a.digit();
        std::vector<u64> ret;
        while(1){
            bigint tmp=a<<z;
            if(tmp<=*this){
                *this-=tmp;
                st v1=z>>6;
                if(ret.size()<=v1)ret.resize(v1+1);
                ret[v1]|=(u64)(1)<<(z&63);
            }
            if(!z)break;
            z--;
        }
        data=ret;
        return *this;
    }
    bigint &operator%=(const bigint &a){
        if(a.digit()>digit())return *this;
        st z=digit()-a.digit();
        while(1){
            bigint tmp=a<<z;
            if(tmp<=*this)*this-=tmp;
            if(!z)break;
            z--;
        }
        return *this;
    }
    bigint operator+(const bigint &a)const{return bigint(*this)+=a;}
    bigint operator-(const bigint &a)const{return bigint(*this)-=a;}
    bigint operator*(const bigint &a)const{return bigint(*this)*=a;}
    bigint operator/(const bigint &a)const{return bigint(*this)/=a;}
    bigint operator%(const bigint &a)const{return bigint(*this)%=a;}
    inline int get(int x){
    	return data[x/64]>>(x%64)&1;
	}
	inline void jia(int x){
		data[x/64]|=1ull<<(x%64);
	}
	inline void shan(int x){
		if(data[x/64]>>(x%64)&1)data[x/64]^=1ull<<(x%64);
	}
};
std::istream &operator>>(std::istream &st,bigint &a){
    std::string s;st>>s;a=bigint(s);return st;
}
std::ostream &operator<<(std::ostream &st,const bigint &a){
    return st<<(std::string)(a);
}
using namespace std;
bigint ppb(bigint x){
	while(x.data.size()&&x.data.back()==0)x.data.pop_back();
	return x;
}
bigint mo(bigint x,int k){
	while((signed)x.digit()>=k+64)x.data.pop_back();
	int tp=x.data.size(),wz=tp*64-k;
	if(k==(tp-1)*64){
		x.data.pop_back();return ppb(x);
	}
	if(wz<64)x.data.back()&=(1ull<<wz)-1;
	return ppb(x);
}
bigint jian(int k){
	bigint b;
	b.data.resize((k+63)/64);
	if(k)b.data.back()|=1ll<<((k+63)%64);
	return b;
}
bigint niyuan(bigint a,int k){
	if(k==1)return 1;
	bigint b=niyuan(a,(k+1)/2);
	bigint bb=b*b*mo(a,k);
	return mo(((bigint)1<<k)-mo(bb,k)+(b<<1),k);
}
struct mont{
	bigint cj,yy,pp,p2;
	int rn;
	void init(bigint p){
		rn=p.digit()+1;p2=p;
		pp=niyuan(p,rn),yy=(bigint)1<<rn;
		cj=((bigint)1<<(2*rn))%p;
	}
	bigint RR(bigint x){
		bigint t=(p2*(yy-mo(x*pp,rn))+x)>>rn;
		while(t>=p2)t-=p2;
		return t;
	}
	bigint R(bigint x){
		return RR(x*cj);
	}
}mon;
bigint mul2(bigint a,bigint b){
	return mon.RR(a*b);
}
bigint n,e;
int s=0;
int ss[100005],dd[100005],tot=0;
void print(){
	ss[1]=1;
	for(int i=2;i<=32768;++i){
		if(!ss[i])dd[++tot]=i;
		for(int j=1;j<=tot&&i*dd[j]<=32768;++j){
			ss[i*dd[j]]=1;
			if(i%dd[j]==0)break;
		}
	}
}
vector<bigint>vc;
mt19937 mt(13770618);
bigint powdv(bigint a,bigint b){
	int m=b.digit();
	bigint ans=mon.R(1);
	for(int i=0;i<m;++i){
		int z=b.get(i);
		if(z)ans=mul2(ans,a);
		a=mul2(a,a);
	}
	return ans;
}
bigint gcd(bigint a,bigint b){
	int g=0;
	while(a&&b){
		int g1=0,g2=0;
		while(!(a&1))a>>=1,++g1;
		while(!(b&1))b>>=1,++g2;
		if(a<b)swap(a,b);
		a-=b;g+=min(g1,g2);
	}
	bigint ans=a+b;
	while(g--)ans<<=1;
	return ans;
}
bigint powd(bigint a,int b){
	bigint ans=1;
	while(b){
		if(b&1)ans=ans*a;
		b>>=1,a=a*a;
	}
	return ans;
}
bool bl;
void dfs(bigint b){
	if(b==1)return;
	int T=30;
	while(T--){
		int m=b.digit();
		bigint x=b;
		for(int i=0;i<m;++i){
			x.shan(i);
			if(mt()%2)x.jia(i);
		}
		while(x.data.size()&&x.data.back()==0)x.data.pop_back();
		bigint a=gcd(x,b);
		if(a==b)continue;
		if(a>1){
			dfs(a);dfs(b/a);
			return;
		}
		mon.init(b);
		bigint c=powdv(mon.R(x),e);
		for(int i=0;i<=s;++i){
			if(c==0)break;
			bigint a=gcd(mon.RR(c)-1,b);
			if(a<b&&a>1){
				dfs(a);dfs(b/a);
				return;
			}
			c=mul2(c,c);
		}
	}
	if(bl){
		vc.emplace_back(b);
		return;
	}
	int m=b.digit();
	for(int k=100;k>=2;--k){
		bigint L=1,R=jian(m*log(2)/log(k)+2);
		while(L<=R){
			bigint mid=(L+R)>>1;
			bigint bb=powd(mid,k);
			if(bb>b)R=mid-1;
			else L=mid+1;
		}
		if(powd(R,k)==b){
			while(k--)vc.emplace_back(R);
			return;
		}
	}
	vc.emplace_back(b);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	print();
	cin>>n>>e;
	while(e%2==0)e/=2,++s;
	for(int i=1;i<=tot;++i){
		int p=dd[i];
		while(n%p==0)n/=p,vc.emplace_back(p);
	}
	if(n.digit()>300)bl=1;
	dfs(n);
	sort(vc.begin(),vc.end());
	cout<<(signed)vc.size()<<'\n';
	for(auto cu:vc)cout<<cu<<'\n';
	return 0;
}

详细

Subtask #1:

score: 0
Time Limit Exceeded

Test #1:

score: 5
Accepted
time: 1ms
memory: 3840kb

input:

1 1

output:

0

result:

ok "0"

Test #2:

score: 0
Time Limit Exceeded

input:

1000001010000010011000000000001 1000001010000000000000000000000

output:


result:


Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Wrong Answer

Test #31:

score: 0
Wrong Answer
time: 121ms
memory: 4224kb

input:

100001100011000011110101000011010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010011101101001101100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 10000...

output:

1
100001100011000011110101000011010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010011101101001101100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

result:

wrong answer 1st words differ - expected: '2', found: '1'

Subtask #4:

score: 0
Wrong Answer

Test #46:

score: 0
Wrong Answer
time: 76ms
memory: 4096kb

input:

11011110000000000010100100101011111000100001100010011001110111010100101110110011111101111100001110110100010000000001111000110000100110111011000111000111001010000001010111010001111111000111100110011010111001011011010001100010101001001111111101000110011110011101011100000001101110111011000101010101101 ...

output:

1
11011110000000000010100100101011111000100001100010011001110111010100101110110011111101111100001110110100010000000001111000110000100110111011000111000111001010000001010111010001111111000111100110011010111001011011010001100010101001001111111101000110011110011101011100000001101110111011000101010101101

result:

wrong answer 1st words differ - expected: '2', found: '1'

Subtask #5:

score: 0
Skipped

Dependency #4:

0%

Subtask #6:

score: 0
Skipped

Dependency #5:

0%

Subtask #7:

score: 0
Skipped

Dependency #6:

0%