1062B - Math

mac2025-11-07  1

质因子无法通过取根号消去,最小只能是质因子相乘,次数为质因子的最大幂次,下一个2的幂次。

 

#include <bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 LL; //typedef unsigned long long ull; //#define F first //#define S second typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef pair<ld,ld> pdd; const ld PI=acos(-1); const ld eps=1e-9; //unordered_map<int,int>mp; #define ls (o<<1) #define rs (o<<1|1) #define pb push_back const int seed=131; const int M = 1e5+7; int p[M],c[M]; int pm; void divide(int n) { pm=0; for(int i=2;i<=sqrt(n);i++) { if(n%i==0) { p[++pm]=i,c[pm]=0; while(n%i==0)n/=i,c[pm]++; } } if(n>1)p[++pm]=n,c[pm]=1;//表示n是个质数 /* for(int i=1;i<=pm;i++) cout<<p[i]<<" "<<c[i]<<endl;*/ } int main() { ios::sync_with_stdio(false); cin.tie(0); int x; cin>>x; if(x==1) { cout<<1<<" "<<0<<endl; return 0; } divide(x); int ma=0,ans=1; bool fg=true; c[0]=c[1]; for(int i=1;i<=pm;i++) { int f=0; if(c[i]!=c[i-1]) fg=false; for(int j=0;j<=29;j++) { int tp=1<<j; if(c[i]>tp/2&&c[i]<=tp) { f=j; break; } } ma=max(f,ma); ans*=p[i]; } // cout<<ma<<" "<<fg<<endl; int t; bool ff=false; for(int i=0;i<=29;i++) { t=1<<i; if(t==c[1])ff=true; } //cout<<fg<<" "<<ff<<endl; if(fg&&ff)ma--; cout<<ans<<" "<<ma+1<<endl; return 0; }

 

最新回复(0)