#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e7+5;
bool vis[maxn];
int pr[maxn/2];
int len = 0;
void E_prime()// 任何一个数 都可以表示为 N = p1^n1*p2^n2.... 形式, 每次只通过最小的素数因子筛选该数
{
memset(vis, true, sizeof(vis));
vis[0] = vis[1] = false;
for(int i = 2; i < maxn; i++)
{
if(vis[i])pr[len++] = i;
for(int j = 0; j < len&&pr[j]*i < maxn; j++)
{
vis[i*pr[j]] = false;
if(i%pr[j] == 0)break;// 保证是 最小的素数 * i
}
}
// N = p1^n1*p2^n2*...pn^n
//都能被 N2 = P1^(n1-1)*p2^n2*。。。pn^n 筛到
}
int main()
{
ios_base::sync_with_stdio(false);
E_prime();
int T, n;
int cnt = 0;
cin>>T;
while(T--)
{
cin>>n;
cnt++;
int cou = 0;
for(int i = 0; i <len&& pr[i]<= n/2; i++)
{
if(vis[n-pr[i]])
{
cou++;
}
}
cout<<"Case "<<cnt<<": "<<cou<<endl;
}
return 0;
}
数论3——素数筛选——欧拉筛素
最新推荐文章于 2019-09-14 13:37:19 发布