zoukankan      html  css  js  c++  java
  • SQFREE

    SQFREE - Square-free integers

    求n以内,约数中不包含任意一个平方数的个数,(n≤10^{14})

    显然为约数计数问题,于是想办法转换为代数问题,不难列出

    [ans=sum_{i=1}^nmu^2(i) ]

    没有gcd,不好反演,考虑容斥,则有

    [ans=sum_{i=1}^{sqrt{n}}mu(i)[n/i^2] ]

    以此即可解决问题,时间复杂度(O(sqrt{n}))

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #define il inline
    #define ri register
    #define ll long long
    #define Size 10000000
    using namespace std;
    bool check[Size+1];
    int prime[1000000],pt,mu[Size+1];
    template<class free>
    il void read(free&);
    il void prepare(int);
    int main(){
        int lsy;read(lsy);
        ll n,i,j,ans;prepare(Size);
        while(lsy--){
            read(n),ans&=0;
            for(i=1;i*i<=n;i=j+1)
                j=sqrt(n/(n/(i*i))),
                    ans+=(mu[j]-mu[i-1])*(n/(i*i));
            printf("%lld
    ",ans);
        }
        return 0;
    }
    il void prepare(int n){
        ri int i,j;mu[1]=1;
        for(i=2;i<=n;++i){
            if(!check[i])prime[++pt]=i,mu[i]=-1;
            for(j=1;j<=pt&&prime[j]*i<=n;++j){
                check[i*prime[j]]|=true;
                if(!(i%prime[j]))break;
                mu[i*prime[j]]=-mu[i];
            }
        }for(i=1;i<=n;++i)mu[i]+=mu[i-1];
    }
    template<class free>
    il void read(free &x){
        x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
        while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
    }
    
    
  • 相关阅读:
    19.1.30 [LeetCode 24] Swap Nodes in Pairs
    19.1.29 [LeetCode 23] Merge k Sorted Lists
    06_Python异常处理机制
    05_Python的文件操作
    04_Python中的35个关键字
    03_Python基础语法
    02_Python开发环境使用和PDB调试
    01_Python基础知识梳理
    socket post
    python_socket_cmd
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/10884606.html
Copyright © 2011-2022 走看看