无平方因子的数

给定一个区间 [n,m],求有多少个数不含平方因子。

首先  求出不超过m的所有素数p,用p^2筛掉 [n,m] 之间的所有倍数。

int Euler(int n) {
    memset(vis,0,sizeof(vis));
    int phi = 0;
    for(int i=2;i<=n;i++) {
        if(!vis[i]) prime[phi++] = i;
        for(int j=0;j<phi&&i*prime[j]<=n;j++) {
            vis[i*prime[j]] = 1;
            if(i%prime[j]==0) break;
        }
    }
    return phi;
}

欧拉公式求出素数表。

用素数的p^2筛选。

bool squre[maxn]; //筛去[n,m] 中的平方因子数 squre[i-n] = 1 筛去。

int Eratosthenes(int n,int m) {
    memset(squre,0,sizeof(squre));
    for(int i=0;prime[i]*prime[i]<=m;i++) {
        int d = prime[i]*prime[i];
        for(int j=1;d*j<=m;j++)
            if(j*d>=n)
                squre[j*d-n] = 1;
    }

    int ans = 0;
    for(int i=0;i<=m-m;i++) {
        if(!squre[i])
            ans++;
    }
    return ans;
}
原文地址:https://www.cnblogs.com/TreeDream/p/7243582.html