Description
Analysis
其实这题是最水的,但是一眼没有看出来于是去码第三题了,接着又码第二题,这题就没时间了。。
其实是数学题,观察发现我们只关心指数的奇偶性。而且显然地当且仅当n是完全平方数时f(n)为奇数。
然后就是水题了。对于每个i,算一下有多少个i*j是完全平方数。若
i∗j
是完全平方数,
i=p∗q21
则
j=p∗q22(p没有平方因子)
,所以合法的
j
的个数为
p可以线筛求,于是复杂度是
O(n)
的。
Code
#include<cstdio>
#include<cmath>
#include<algorithm>
#define fo(i,a,b) for(ll i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int N=10000010;
ll n,m,ans,p[N],pri[N];
bool bz[N];
void pre(ll n)
{
p[1]=1;
fo(i,2,n)
{
if(!bz[i])
{
pri[++pri[0]]=i;
p[i]=i;
}
fo(j,1,pri[0])
{
int t=i*pri[j];
if(t>n) break;
bz[t]=1;
if(i%pri[j]==0)
{
if(p[i]%pri[j]==0) p[t]=p[i]/pri[j];
else p[t]=p[i]*pri[j];
break;
}
p[t]=p[i]*pri[j];
}
}
}
int main()
{
scanf("%lld %lld",&n,&m);
pre(n);
fo(i,1,n)
if(ll(sqrt(m/p[i]))%2==0) ans++;
else ans--;
printf("%lld",ans);
return 0;
}