警示:关于 ABC D
  • 板块题目总版
  • 楼主__vector__
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/12/3 23:37
  • 上次更新2023/10/27 00:33:45
查看原帖
警示:关于 ABC D
507348
__vector__楼主2022/12/3 23:37

调换 47 行和 49 行也能过样例

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+5;
ll yinshu[maxn],cnt[maxn];
int top;
ll k;
ll calc(ll a,ll b)
{
    ll sum=0;
    while(a)
    {
        sum+=a/b;
        a/=b;
    }
    return sum;
}
bool check(ll k,ll n)
{
    for(int i=1;i<=top;i++)
    {
        if(calc(n,yinshu[i])<cnt[i])
        {
            return 0;
        }
    }
    return 1;
}
int main()
{
    scanf("%lld",&k);
    ll temp=k;
    for(ll i=2;i*i<=k;i++)
    {
        if(k%i==0)yinshu[++top]=i;
        while(k%i==0)
        {
            k/=i;
            cnt[top]++;
        }
    }
    if(k!=1)
    {
        yinshu[++top]=k;
        cnt[top]++;
    }
    k=temp;
    ll ans=k;
    ll l=2,r=k+1;
    while(l<r)
    {
        ll mid=(l+r)>>1;
    //  printf("l: %lld r: %lld mid: %lld\n",l,r,mid);
        if(check(k,mid))
        {
            ans=mid;
            r=mid;
        }
        else l=mid+1;
    }
    printf("%lld",ans);
    return 0;
}
2022/12/3 23:37
加载中...