社区讨论
求助各位大佬
P4213【模板】杜教筛参与者 5已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo90mliz
- 此快照首次捕获于
- 2023/10/28 03:37 2 年前
- 此快照最后确认于
- 2023/10/28 03:37 2 年前
各位谷民,请问P4213的这个提交记录是什么鬼???玄学CE???
代码:
CPP#include<bits/stdc++.h>
using namespace std;
int t,n,vis[5000001],cnt,prime[5000001],mu[5000001]{0,1},w[5000001];
long long phi[5000001]{0,1},ans;
bitset<5000001>v;
int _(int x){
return n/x;
}
int cal(int n){
if(n<=5000000)return mu[n];
if(v[_(n)])return w[_(n)];
int ret=1;
for(int l=2,r;l<=n;l=r+1){
r=n/(n/l);
ret-=(r-l+1)*cal(n/l);
}
v[_(n)]=1;
return w[_(n)]=ret;
}
int main(){
for(int i=2;i<=5000000;i++){
if(!vis[i])prime[++cnt]=i,mu[i]=-1,phi[i]=i-1;
for(int j=1;j<=cnt&&i*prime[j]<=5000000;j++){
vis[i*prime[j]]=1;
if(!(i%prime[j])){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
mu[i*prime[j]]=-mu[i];
}
mu[i]+=mu[i-1];
phi[i]+=phi[i-1];
}
cin>>t;
while(t--){
ans=0;
v.reset();
scanf("%d",&n);
if(n<=5000000)printf("%lld %d\n",phi[n],mu[n]);
else{
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=(n/l)*(n/l+1)/2*(cal(r)-cal(l-1));
}
printf("%lld %d\n",ans,cal(n));
}
}
}
悬赏关注,bbl
回复
共 4 条回复,欢迎继续交流。
正在加载回复...