HYSBZ 2440 完全平方数(莫比乌斯反演)

若i为质数,n为i*i的倍数,则称n为含平方因子数。

求1~n的无平方因子数。

F(x)为1~x的平方因子数数量,则由容斥原理及莫比乌斯函数知:

G(x)为1~x的无平方因子数数量,则:

二分法枚举,注意二分法的写法。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=45000;
bool vis[N];
int mu[N];
int prime[N];
void Mobius(int n){
    memset(vis,0,sizeof(vis));
    mu[1]=1;
    int tot=0;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            prime[tot++]=i;
            mu[i]=-1;
        }
        for(int j=0;j<tot&&i*prime[j]<=n;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0){
                mu[i*prime[j]]=0;
                break;
            }else{
                mu[i*prime[j]]=-mu[i];
            }
        }
    }
}

LL getNum(int n){
    int e = (int)sqrt(n);
    LL ans = 0;
    for(LL i = 1; i <= e; i++){
        ans += mu[i] * (LL)(n/(i * i));
    }
    return ans;
}
int main(){
    Mobius(N - 2);
    int t, k;
    scanf("%d", &t);
    while(t--){
        scanf("%d", &k);
        LL l = 1, r = 2 * k + 1, pos;
        while(l < r){
            LL mid = (l + r)/2;
            if(getNum(mid) < k){
                l = mid + 1;
                pos = l;
            }else{
                r = mid;
                pos = r;
            }
        }
        printf("%lld\n", pos);
    }
    return 0;
}
时间: 2024-10-11 16:04:21

HYSBZ 2440 完全平方数(莫比乌斯反演)的相关文章

BZOJ 2440 完全平方数(莫比乌斯反演,容斥原理)

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 题意:求第K个没有平方因子的数 思路:首先,可以二分数字,然后问题就转变成x以内有多少无平方因子的数 根据容斥原理:x以内无平方因子数=1*无需是任何质数的倍数的数数量-1*至少是1个质数的平方的倍数的数数量+1*至少是2个质数的平方的倍数的数量-1*至少是3个质数的平方的倍数的数量............然后发现,莫比乌斯函数u[i]正好满足:当i是不同的质数乘积时,返回-1,有相同因子就

bzoj 2440 简单莫比乌斯反演

题目大意: 找第k个非平方数,平方数定义为一个数存在一个因子可以用某个数的平方来表示 这里首先需要考虑到二分才可以接下来做 二分去查找[1 , x]区间内非平方数的个数,后面就是简单的莫比乌斯反演了 容斥原理的思想,首先考虑所有数都属于非平方数 那么就是x 然后对于每一个平方数都要减去,但是这里应该只考虑质数的平方数就可以了 那么就扩展为x - x/(2^2) - x/(3^2) - x/(k^2).... 然后因为中间存在重复减的那么要加回来 -> x - x/(2^2) - x/(3^3) 

BZOJ 2440: [中山市选2011]完全平方数 二分答案 + 容斥原理 + 莫比乌斯反演

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 第一道莫比乌斯反演的题目. 二分答案 + 容斥那里还是挺好想的. 二分一个答案val,需要[1, val]之间存在的合法数字个数 >= k即可. 怎么判断呢?可以容斥,开始的时候有ans = val个,但是这里明显有些数字不符合. ans -= ([1...val]中有多少个2^2倍  + [1...val]中有多少个3^2倍 + [1...val]中有多少个5^2倍) ...... 但是减

BZOJ 2440 完全平方数(莫比乌斯反演+二分查找)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23362 题意:定义含有平方数因子的数为完全平方数(平方数因子不包含1).求第k个非完全平方数. 思路:我们先求出[1, n]的非完全平方数的个数,然后利用二分来查找正好等于k时的n(注意这样的n可能不止一个,求最左边的).关键是,怎么求出前者,我们可以利用容斥原理,用n - [1, n]内完全平方数的个数,求[1, n]内完全平方数的个数,用容斥发现前面的系数就是

【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一个小X讨厌

莫比乌斯反演2

\documentclass[12pt,UTF8,titlepage]{article} \usepackage[colorlinks,linkcolor=blue]{hyperref} \usepackage{fontspec} \usepackage{xunicode} \usepackage{xltxtra} \usepackage{amstext} \usepackage{amsmath} \usepackage{amssymb} \usepackage{listings} \usepa

csu 2014 summer training day 2 莫比乌斯反演

SPOJ VLATTICE 题意:x,y,z<=1000000,x<=a,y<=b,z<=c,给定a.b.c,求gcd(x,y,z)=1的个数 解释:设 f(n)是gcd(x,y,z)=n的种数,F(n)=n|gcd(x,y,z)的种数 那么F(n)=f(n)+f(2n)....=sigm(f(d)){n|d} 那么根据反演公式 f(n)=sigm(u(d/n)*F(d)){n|d} 我们要求的是f(1)=sigm(u(1)*F(n)+u(2)*F(2n)+u(3)*F(3n)..

莫比乌斯反演题目列表

前言: 本题表中,凡是涉及\(n.m\),都默认\(n \leq m\). Part1 这些题目都非常水,莫比乌斯反演入门题, 主要是对莫比乌斯反演应用有一个基本概念. 1.[HAOI2011]Problem b (具体题目戳我) 题目:一组数据(\(a.d.c.d \leq 5×10^4\))求 \[\sum_{i=a}^{b} \sum_{j=c}^d [gcd(i,j)=d]\] 题解: \[\sum_{i=1}^{n} \sum_{j=1}^m [gcd(i,j)=d] = \sum_{

与莫比乌斯反演没什么关系的莫比乌斯函数题

Codeforces 1139D. Steps to One 题目大意: 给出$m$,一个空的数列,每次可以$rand$一个数$x\in[1,m]$放到数列的末尾,若整个数列的$gcd==1$则停止加入数 求数列的期望长度 思路: 考虑当前整个数列的$gcd$为质数$p$的倍数,则若下一个数还是$p$的倍数即$\sum\limits_{i=1}^m [gcd(i,p)==p]$,相当于没变 则设当前$gcd$对答案产生的贡献为$ans_x$得到:$ans_x=1+ \sum\limits_{i=