您的位置:首页 > 其它

Jzoj4782 Math

2017-10-24 20:46 471 查看


若一个数x是平方数,则d(x)为平方数

所以就是要考虑有多少对i*j为平方数

我们假设,i=p*k^2,那么,j=p*q^2时,i*j为平方数(p不含平方因子,k,q为正整数)

所以,我们对于一个i=p*k^2,对应的j就有[√m/p]种

我们考虑快速求p,这样对于所有k,i=p*k^2的答案都是一样的,要么是1或-1

采用线性筛法,对于一个合法的p,我们可以筛掉p*k^2 ,这样时间复杂度是就是线性的

#include<stdio.h>
#include<math.h>
#define N 10000000
#define L long long
bool vis[10000020]={0};
L n,m,ans=0;
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)
if(!vis[i]){
int c=0;
for(int j=1;i*j*j<=n;++j) vis[i*j*j]=1,++c;
ans+=((int)sqrt(1.*m/i))&1?-c:c;
}
printf("%lld\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息