ABC D 求助
  • 板块学术版
  • 楼主_cosmic_rays_
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/12/3 21:40
  • 上次更新2023/10/27 00:34:22
查看原帖
ABC D 求助
846227
_cosmic_rays_楼主2022/12/3 21:40

RT,一直 RE 3个点,哭了。。。

求调。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e7+5;
ll n;int a[maxn];
int cnt,l[maxn];
inline ll qp(int x,int y){
	ll res=1;
	while(y){
		if(y&1) res*=x;
		x*=x;
		y>>=1;
	}
	return res;
}
inline bool check(ll mid,ll p,ll b){
	ll u=0;
	for(int i=1;i<=a[p];++i)
		u+=mid/qp(p,i);
	return u>=b;
}
inline ll js(ll a,ll b){
	ll l=a,r=1e9;
	if(b==1) return a;
	ll ans;
	while(l<=r){
		ll mid=l+r>>1ll;
		if(check(mid,a,b)){
			r=mid-1;
			ans=mid;
		}
		else l=mid+1;
	}
	return ans;
}
inline ll work(ll n){
	ll p=sqrt(n);
	for(ll i=2;i<=p;++i){
		if(n%i==0) l[++cnt]=i;
		while(n%i==0){
			n/=i;
			++a[i];
		}
	}
	ll ans=n;
	for(ll i=1;i<=cnt;++i)
		ans=max(ans,js(l[i],a[l[i]]));
	return ans;
}
signed main(){
	scanf("%lld",&n);
	printf("%lld",work(n));
	return 0;
}
2022/12/3 21:40
加载中...