无平方因子的数
给定一个区间 [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; }