筛法 program:(足足要5s)
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int ff[100000000];
int pp[10000000];
int main()
{
for(__int64 i=2;i*i<=100000000;i++)
if(!ff[i])
for(__int64 g=i*i;g<=100000000;g+=i)
ff[g]=1;
int cnt=0;
for(__int64 i=2;i<=100000000;i++)
if(!ff[i])
cnt++;
cout<<cnt<<endl;
system("pause");
return 0;
}
题目大意&&思路:筛法已经不行了~~~要用容斥定理
筛法 program:(足足要5s)
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int ff[100000000];
int pp[10000000];
int main()
{
for(__int64 i=2;i*i<=100000000;i++)
if(!ff[i])
for(__int64 g=i*i;g<=100000000;g+=i)
ff[g]=1;
int cnt=0;
for(__int64 i=2;i<=100000000;i++)
if(!ff[i])
cnt++;
cout<<cnt<<endl;
system("pause");
return 0;
}
容斥定理 program(模板):
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int ff[10010],kg;
int pp[10010];
int n;
int cnt;
int now;
void solve(int index,int mul,int k)
{
int t;
if(k==0)
{
now+=n/mul;
return;
}
for(int i=index;i<kg-k+1;i++)
{
mul*=pp[i];
t=now;
if(mul<=n)
{
solve(i+1,mul,k-1);
}
if(t==now)return;
mul/=pp[i];
}
}
bool judge(int p)
{
for(int i=2;i*i<=p;i++)
if(p%i==0)
return 0;
return 1;
}
int main()
{
for(int i=2;i<=10010;i++)
if(!ff[i])
{
for(int g=i*i;g<=10010;g+=i)
ff[g]=1;
}
while(cin>>n)
{
cnt=0;
if(n<=10010)
{
for(int i=2;i<=n;i++)
if(!ff[i])
cnt++;
cout<<cnt<<endl;
continue;
}
kg=0;
for(int i=2;i*i<=n;i++)
{
if(!ff[i])
pp[kg++]=i;
}
for(int i=1;i<=kg;i++)
{
now=0;
solve(0,1,i);
if(now==0)break;
if(i&1)
cnt+=now;
else
cnt-=now;
}
cnt-=kg;
cnt=n-cnt-1;
if(judge(n))
cnt--;
cout<<cnt<<endl;
}
return 0;
}
参考博客:http://hi.baidu.com/optimum_mat/item/3233924eae9bd31e6dc2f0ef
使用容斥定理求1亿内素数数量
该博客探讨了如何在超过筛法限制的情况下,利用容斥定理来计算1亿以内的素数个数。博主分享了容斥原理在解决这个问题上的应用,并提供了程序模板。
5001

被折叠的 条评论
为什么被折叠?



