社区讨论
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 条回复,欢迎继续交流。
正在加载回复...