威尔逊定理:是 p 为质数的充要条件
推论一:如果 p 是质数,
推论二:如果 p 是大于4的合数,
下面用一道实际应用题来举例:
给定n,求:
分析:
令p=3k+7则
1. 当p为质数时,前面是整数,后面向下取的整数,结果为1
2. p是大于4的合数时,后面为整数,前面为略大于后面的小数,向下取整为0
所以只要统计p是质数的个数就行
pass代码:
#include<iostream>
using namespace std;
int prime[3000000];
int notprime[3000000];
int need[1000000];
int sum = 0;
int psize = 1;
void getprime()
{
for (long long i = 2; i <= 3000000; i++)
{
if (notprime[i])continue;
for (long long j = i*i; j <= 3000000; j+=i)
{
notprime[j] = 1;
}
if ((i - 7) % 3 == 0 && i != 7)
{
prime[(i-7)/3] = 1;
}
}
}
int main()
{
int t;
cin >> t;
getprime();
for (long long k = 2; k <= 1000000; k++)
{
need[k] = need[k - 1] + prime[k];
}
for (int i = 0; i < t; i++)
{
int sum = 0;
int n;
cin >> n;
cout << need[n] << endl;
}
}
刚开始,我将need[ ]大小设为3000000,然后下面给need赋值也循环3000000次,明显超时而且超内存,后面发现将上面有prime[ i ](输出need[ n*3+7 ])改为prime[ (i+7)/3 ](输出need[ n ])这样就可以缩小need的大小了。