【HDU 2098】 分拆素數和 線性篩

Problem Description
把一個偶數拆成兩個不同素數的和,有幾種拆法呢?

Input
輸入包含一些正的偶數,其值不會超過10000,個數不會超過500,若遇0,則結束。

Output
對應每個偶數,輸出其拆成不同素數的個數,每個結果佔一行。

Sample Input
30
26
0

Sample Output
3
2

思路(線性篩):

模板題,套線性篩的板子,先打表,然後遍歷2->n/2,若vis[i]和vis[n-i]都爲0代表都是素數,cnt++,其中vis是篩法裏面的標記數組

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include <stack>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define maxn 10000+500
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int maxm = 100000+5;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') ch = getchar();while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0',  ch = getchar();return x; }
bool vis[maxn];
ll primes[maxn];

void Prime()
{
    memset(vis,0,sizeof(vis));
    ll tot = 1; vis[2] = vis[4] = 1;
    primes[0] = 2;
    for(int i=3;i<maxn;i++)
    {
        if(i%2==0)
        {
            vis[i] = 1;
            continue;
        }
        if(!vis[i]) primes[tot++] = i;
        for(int j=0;j<tot&&i*primes[j]<maxn;j++)
        {
            vis[i*primes[j]] = 1;
            if(i%primes[j]==0)
                break;
        }
    }
}

int main()
{
    int n;
    Prime();
    while(cin>>n&&n)
    {
        int cnt = 0;
        for(int i=2;i<n/2;i++)
        {
            if(!vis[i]&&!vis[n-i])
            cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章