Description
Solution
如果 di∗j 为奇数,那么 i∗j 一定是完全平方数。
对于一个
i
,可以表示为
那么,我们给
a2p≤m
化简得: a≤mp−−−√ 。
那么对于 i=p 的情况,我们可以直接得出答案为 mi−−−√ 。
那么如果有 i′=i∗q2 ,我们的答案还是 mi−−−√ 。
那么这些答案可以一次算完,然后筛掉 i′ ,减少复杂度。
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define N 10000001
#define ll long long
using namespace std;
bool bz[N];
int main()
{
int n;
ll m;
cin>>n>>m;
int ans=0;
fo(i,1,n)
if(!bz[i])
{
int t=sqrt(n/i),q=sqrt(m/i);
if(q%2) ans-=t;
else ans+=t;
fo(j,1,t) bz[i*j*j]=1;
}
cout<<ans;
}