P3383
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8+5;
bool d[maxn]={false};
int pri[100005],len=0,n,t,x;
void ols(){
for(int i=2;i<=n;i++){
if(!d[i])pri[++len]=i;
for(int j=1;pri[j]*i<=n&&j<=len;j++){
d[pri[j]*i]=true;
if(i%pri[j]==0)break;
}
}
}
int main(){
scanf("%d%d",&n,&t);
ols();
while(t--){
scanf("%d",&x);
printf("%d\n",pri[x]);
}
return 0;
}
P4318 莫比乌斯函数,容斥原理
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll max_num=1644934082,max_num2=40559,max_num3=4253;
ll t,x,mark[max_num2+5],mu[max_num2+5],pri[max_num3+5],cnt=0;
void init(){
mu[1]=1;
for(ll i=2;i<=40559;i++){
if(!mark[i])pri[++cnt]=i,mu[i]=-1;
for(ll j=1;j<=cnt&&pri[j]*i<=40559;j++){
ll x=pri[j];
mark[x*i]=true;
if(i%x==0){
mu[i*x]=0;
break;
}
else mu[i*x]=-mu[i];
}
}
// for(int i=1;i<=cnt;i++)cout<<pri[i]<<" ";
// cout<<endl;
}
ll check(ll num){
ll ans=0;
for(ll i=1;i*i<=num;i++){
ans+=mu[i]*(num/(i*i));
}
return ans;
}
ll Q(){
ll l=x-1,r=max_num+1;//paiming
while(l+1<r){
ll mid=(l+r)>>1;
// cout<<l<<" "<<r<<" "<<mid<<" "<<check(mid)<<endl;
if(check(mid)<x)l=mid;
else r=mid;
}
return r;
}
int main()
{
init();
scanf("%lld",&t);
while(t--){
scanf("%lld",&x);
printf("%lld\n",Q());
}
return 0;
}
P2568 欧拉函数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn=1e7+5;
bool d[maxn]={false};
int pri[1000005],len=0,n,t,x;
ll phi[maxn],sum[maxn],ans=0;
void ols(){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!d[i])pri[++len]=i,phi[i]=i-1;
for(int j=1;pri[j]*i<=n&&j<=len;j++){
int x=pri[j];
d[x*i]=true;
if(i%x==0){
phi[i*x]=phi[i]*x;break;
}
else phi[i*x]=phi[i]*phi[x];
}
}
return ;
}
int main(){
scanf("%d",&n);
ols();
// for(int i=1;i<=n;i++)cout<<phi[i]<<" ";
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+phi[i];
for(int i=1;i<=len;i++)ans=ans+sum[n/pri[i]]*2-1;
cout<<ans;
return 0;
}