您的位置:首页 > 其它

【jzoj4782】【Math】【线性筛法】

2016-09-23 21:29 337 查看

题目大意



解题思路

这里有一个小小的结论,只有i*j是完全平方数时d是奇数,可以求出i的非完全平方因子p,奇数的个数即为m/p−−−−√,p可以用线筛来预处理。

code

#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LF double
#define LL long long
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a>b)?b:a)
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
int const maxn=10000000,inf=2147483647;
LL n,m,ss[maxn+10],tag[maxn+10],p[maxn+10];
int main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
scanf("%lld%lld",&n,&m);
p[1]=1;
fo(i,2,n){
if(!tag[i]){
ss[++ss[0]]=i;
p[i]=i;
}
for(int j=1;(j<=ss[0])&&(1ll*ss[j]*i<=n);j++){
tag[ss[j]*i]=1;
if(p[i]%ss[j]==0)p[ss[j]*i]=p[i]/ss[j];
else p[ss[j]*i]=p[i]*ss[j];
if(i%ss[j]==0)break;
}
}
LL ans=0;
fo(i,1,n)
if((LL)sqrt(m/p[i])%2==1)ans--;
else ans++;
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: