Problem
Description
Input
Output
Sample Input
3 5
Sample Output
-1
Data Constraint
Solution
我们发现,只有当i*j是完全平方数时,d(i,j)为奇数。所以我们只用统计有多少个
i∗j
是完全平方数。
我们设sum[i]表示
Π质因数指数为奇数的质因数质因数
,所以当sum[i]=1时,i是完全平方数。设mp[i]为i中最小的质因数。z[i]为i中最小的质因数的指数。
那么我们要适当的更新mp[i]和z[i].
最后我们计算答案。
如果i是完全平方数,那么就会产生
m−−√
个完全平方数,否则产生
msum[i]−−−−−√
个完全平方数。
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define N 10000010
#define LL long long
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int i,j,t,tot;
LL ans,s,n,k,l,x,m,p[700001],sum[N],mp[N],z[N];
bool b[N];
int main()
{
scanf("%lld%lld",&n,&m);
sum[1]=1;
fo(i,2,n)
{
if (!b[i])
{
p[++tot]=i;
sum[i]=mp[i]=i;
z[i]=1;
}
fo(j,1,tot)
{
x=i*p[j];
if (x>n) break;
b[x]=1;
mp[x]=p[j];
if (mp[i]==p[j])
{
z[x]=z[i]+1;
if (z[i]%2==1) sum[x]=sum[i]/p[j];
else sum[x]=sum[i]*p[j];
} else z[x]=1,sum[x]=sum[i]*p[j];
if (i%p[j]==0) break;
}
}
fo(i,1,n)
{
s=0;
if (sum[i]==1) s+=sqrt(m);
else s+=sqrt(m/sum[i]);
if (s%2==0) ans++;else ans--;
}
printf("%lld",ans);
}