zoukankan      html  css  js  c++  java
  • Jzoj4782 Math

    若一个数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
    ",ans);
    }

  • 相关阅读:
    Python3之网络编程
    Python3之内置函数
    Python3之面向对象
    Python3之函数
    Python3基础数据类型-字符串
    else配合while或者for循环只用注意点
    字符串
    元组
    48964
    1651
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/7774339.html
Copyright © 2011-2022 走看看