专栏文章
题解:SP3505 CPRIME - Prime Number Theorem
SP3505题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miq82gxx
- 此快照首次捕获于
- 2025/12/04 00:29 3 个月前
- 此快照最后确认于
- 2025/12/04 00:29 3 个月前
思路:
这一题题意很明确,就是给一个 ,求下面一个式子

因为多测且 最大只有 ,所以可以预处理范围内每个 的 ,最后输出答案即可。
代码:
CPP#include<bits/stdc++.h>
//#define int long long
using namespace std;
const long long N=1e8+10;
long long pri[N],phi[N],cnt;
long long n;
bool vis[N];
void f(){
vis[1]=vis[0]=1;
for(long long i=2;i<N;i++){
if(!vis[i]) pri[++cnt]=i;phi[i]=cnt;
for(long long j=1;j<=cnt && pri[j]*i<=N;j++)
vis[i*pri[j]]=1;
}
}
signed main(){
//ios::sync_with_stdio(0);
//cin.tie(0),cout.tie(0);
f();
while(1){
scanf("%lld",&n);
if(n==0) break;
double ans=n*1.0/log(n*1.0);
ans=abs(ans-phi[n])*100.0/phi[n];
printf("%.1lf\n",ans);
}
return 0;
}
最后有一点疑问:为什么下面的代码 一大就算不对?
CPPvoid f(){
phi[1]=1;
for(long long i=2;i<N;++i){
if(vis[i]==0) pri[++cnt]=i,phi[i]=cnt;
for(long long j=1;j<=cnt && pri[j]<=N/i;++j){
vis[i*pri[j]]=1;
if(!(i%pri[j])){
phi[i*pri[j]]=pri[j]*phi[i];
break;
}
else phi[i*pri[j]]=(pri[j]-1)*phi[i];
}
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...