社区讨论

TLE70求调

P10584 [蓝桥杯 2024 国 A] 数学题参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m2csfvri
此快照首次捕获于
2024/10/17 12:15
去年
此快照最后确认于
2025/11/04 17:01
4 个月前
查看原帖
最后6个点超时。 我不明白,为什么在本地开O2极限数据3.658s,交到luogu上就超时了,这注定成为了我的葬身之地吗? 代码:
CPP
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N=3e6+3;
int B,mu[N],smu[N],smumu[N];
unordered_map <ll,ll> mpmu;
vector <int> prime;
bool not_p[N];
inline void init()
{
    not_p[1]=mu[1]=smu[1]=smumu[1]=1;
    for(int i=2;i<=B;++i)
    {
        if(!not_p[i])
        {
            prime.push_back(i);
            mu[i]=-1;
        }
        smu[i]=smu[i-1]+mu[i],smumu[i]=smumu[i-1]+mu[i]*mu[i];
        for(int p:prime)
        {
            if(p*i>B) break;
            not_p[i*p]=1;
            if(i%p==0)
            {
                mu[i*p]=0;
                break;
            }
            mu[i*p]=-mu[i];
        }
    }
}
ll summu(ll n)
{
    if(n<=B) return smu[n];
    if(mpmu.count(n)) return mpmu[n];
    ll l=2,r,ret=1;
    while(l<=n)
    {
        r=n/(n/l);
        ret-=summu(n/l)*(r-l+1);
        l=r+1;
    }
    return mpmu[n]=ret;
}
inline ll summumu(ll n)
{
    if(n<=B) return smumu[n];
    ll t,mx=sqrt(n),l=1,r,ret=0;
    while(l<=mx)
    {
        t=n/(l*l);
        r=sqrt(n/t);
        ret+=(summu(r)-summu(l-1))*t;
        l=r+1;
    }
    return ret;
}
inline ll solve(ll n,ll m)
{
    ll l=1,r,ret=0,mx=min(n,m),tn,tm;
    while(l<=mx)
    {
        tn=sqrt(n/l),tm=sqrt(m/l);
        r=min(n/tn/tn,m/tm/tm);
        ret+=(summumu(r)-summumu(l-1))*tn*tm;
        l=r+1;
    }
    return ret;
}
int main()
{
    ll n,m;
    scanf("%llu%llu",&n,&m);
    B=pow(max(n,m),0.4);
    init();
    printf("%llu\n",solve(n,m));
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...