链接:NYOJ580, click here~~
----
题目:区间求无平方因子数的个数。无平方因子数:即对于任意一个素数p,p^2都不会整除那个数,如1 , 5=5 , 15=3*5都是无平方因子数,而20=2^2*5不是。现在给定一个n (1 <= n < 10^12) ,求区间[n,m]中无平方因子数的个数。
思路:一下午就在思考这道题,考查数论的素数筛法,加一个容斥原理,最近复习素数筛法,
自己应该卡在容斥原理的递归实现,想了好久,
uestc 1746,链接:click here
代码:
#include<cmath> #include<queue> #include<deque> #include<stack> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; #define Max(a,b) a>b?a:b #define Min(a,b) a>b?b:a #define mem(a,b) memset(a,b,sizeof(a)) int dir[4][2]= {{0,-1},{-1,0},{0,1},{1,0}}; const double eps = 1e-6; const double Pi = acos(-1.0); #define maxn 1000005 int prime[maxn]; bool flag[maxn]; int cc=0; void prim() { for(int i=2; i<=maxn; i++) { if(!flag[i]) { prime[cc++]=i; for(int j=2; j*i<maxn; j++) { flag[j*i]=1; } } } } //容斥原理 long long int dfs(int nn,long long int mm) { long long int sum=0; for(int i=nn; i<cc&&(long long int)prime[i]*prime[i]<=mm; i++) { sum+=mm/prime[i]/prime[i]-dfs(i+1,mm/prime[i]/prime[i]); } return sum; } int main() { //freopen("1.txt","r",stdin); //freopen("2.txt","w",stdout); prim(); long long int n,m; while(~scanf("%lld%lld",&n,&m)) { printf("%lld\n",(m-dfs(0,m))-(n-dfs(0,n))+1); } return 0; }