BZOJ2440(全然平方数)二分+莫比乌斯容斥

BZOJ2440(全然平方数)二分+莫比乌斯容斥

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

题意:全然平方数是指含有平方数因子的数。求第ki个非全然平方数。


解法:比較明显的二分,getsum(int middle)求1-middle有多少个非全然平方数,然后二分。求1-middle的非全然平方数个数能够用总数减掉全然平方数个数。计算全然平方数的个数用容斥:

    首先加上n/(2*2)+n/(3*3)+n/(5*5)+n/(7*7)…+…然后减掉出现两次的,然后加上三次的…奇加偶减。这就是mou的原型,用mou数组计算非常easy;

       BZOJ2440(全然平方数)二分+莫比乌斯容斥

代码:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef unsigned long long LL;
const int Max=100010;
const LL INF=2e16+7;

LL mou[Max];
void init()
{
    for(LL i=2; i<Max; i++)
    {
        if(!mou[i])
        {
            mou[i]=i;
            for(LL j=i*i; j<Max; j+=i)
                mou[j]=i;
        }
    }
    mou[1]=1;
    for(int i=2; i<Max; i++)
    {
        if(i/mou[i]%mou[i]==0) mou[i]=0;
        else mou[i]=-mou[i/mou[i]];
    }
}
int k;
LL getnum(LL middle)
{
    LL ans=0;
    for(LL i=1; i*i<=middle; i++)
    {
        ans+=mou[i]*(middle/(i*i));
    }
    return ans;
}
int main()
{
    init();
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%d",&k);
        LL left=1,right=INF;
        while(left<=right)
        {
            int middle=(left+right)/2;
            if(getnum(middle)<k)
                left=middle+1;
            else
                right=middle-1;
        }
        cout<<left<<'\n';
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118488.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++ string find_VBA中find的用法

    c++ string find_VBA中find的用法#include<string>string是c++中一个非常重要函数。在处理字符串的时候经常用到。find是string中一个查找函数。find用法:1.find()示例:(上代码)#include<iostream>#include<string>usingnamespacestd;intmain(){ s…

    2022年10月14日
    0
  • volatile关键字及其作用

    volatile关键字及其作用概述:本文主要介绍Java语言中的volatile关键字,内容涵盖volatile的保证内存可见性、禁止指令重排等。

    2022年5月31日
    29
  • python和pycharm以及anaconda的安装顺序_症证病三者之间区别

    python和pycharm以及anaconda的安装顺序_症证病三者之间区别1、致欢迎词我将详细讲述在学Python初期的各种手忙脚乱的问题的解决,通过这些步骤的操作,让你的注意力集中在Python的语法上以及后面利用Python所解决的项目问题上。而我自己作为小白,很不幸的没有错过任何的坑,都跳了进去,所以在这里写下经验贴,一方面希望能给后来的学者能够高效的避开这些坑,另一方面也算是自己的总结与警告。2、内容大纲2.1安装顺序能够使用Python的安装…

    2022年8月28日
    0
  • nifi mysql hive_Nifi入门

    nifi mysql hive_Nifi入门NiFi基本概念概述简单地说,NiFi是为了自动化系统之间的数据流而构建的。虽然术语“数据流”在各种环境中使用,但我们在此处使用它来表示系统之间自动化和管理的信息流。这个问题空间一直存在,因为企业有多个系统,其中一些系统创建数据,一些系统消耗数据。已经讨论并广泛阐述了出现的问题和解决方案模式。企业集成模式中提供了一个全面且易于使用的表单。NiFi的诞生,要致力于解决的问题:因为网络故障、磁盘故障…

    2022年10月25日
    0
  • C语言-if语句_c语言if语句表达式

    C语言-if语句_c语言if语句表达式1、一般形式if(表达式)表达式1else表达式2:表达式成立(为真)则执行表达式1,否则执行表达式2.适用范围:真假,对错,开关,对立面的条件注意:如果if语句中只包括一条语句,可以省略

    2022年8月5日
    3
  • micropython教程_md转word

    micropython教程_md转word之前的博客格式不太完美,所以我学习了一下MD编译器相关操作,并把常用的操作总结在这篇博客里面,希望大家可以学习一下,来美观自己的博客

    2022年9月24日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号