cogs 2056. 无平方因子数
2056. 无平方因子数
★☆ 输入文件:non.in
输出文件:non.out
简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
给出正整数n,m,区间[n,m]内的无平方因子数有多少个?
整数p无平方因子,当且仅当不存在k>1,使p是k^2的倍数,1<=n<=m<=10^12,m-n<=10^7
【输入格式】
两个整数n,m
【输出格式】
[n,m]间的无平方因子数的个数
【样例输入】
1 5
【样例输出】
4
【提示】
在此键入。
【来源】
刘汝佳《入门经典》
思路:对不超过根号 m的所有的素数p,筛掉区间[n,m]内的p2的所有的倍数。所以跑两边筛法。
错因:筛p2的倍数时,筛法的常数过大,TLE两个点。
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long n,m; int len,tot,num; bool v[50000001],vis[1000001]; long long prime[1000001]; void eratos(){ memset(vis,true,sizeof(vis)); vis[1]=false; for(int i=2;i<=len;i++){ if(vis[i]) prime[++tot]=i; for(int j=1;prime[j]*i<=len;j++){ vis[i*prime[j]]=false; if(i%prime[j]==0) break; } } } int main(){ freopen("non.in","r",stdin); freopen("non.out","w",stdout); scanf("%lld%lld",&n,&m); len=sqrt(m); eratos(); for(int i=1;i<=tot;i++){ long long now=prime[i]*prime[i]; for(long long j=n/now*now;j<=m;j+=now) if(j>=n) v[j-n]=1; } for(int i=0;i<=m-n;i++) if(!v[i]) num++; cout<<num; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。