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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cts蓝牙在哪里(蓝牙怎么测试)

    安装蓝牙测试安装包之后。安卓包名字android-cts-6.0_r19-linux_x86-x86.zip解压之后/cts/android-cts/tools/目录下运行./cts-tradefed进入之后运行runcts-pandroid.bluetooth–skip-preconditions转载于:https://…

    2022年4月14日
    69
  • 2021.5iDea激活码[在线序列号]

    2021.5iDea激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    45
  • 栈 数据结构_单调栈和单调队列

    栈 数据结构_单调栈和单调队列单调栈笔者在做leetcode的题(下一个出现的最大数字)时,接触到了单调栈这一种数据结构,经过研究之后,发现单调栈在解决某些问题时出奇的好用,下面是对单调栈的性质和一些典型题目。什么是单调栈?从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈单调递增栈:数据出栈的序列为单调递增序列单调递减栈:数据出栈的序列为单调递减序列ps:这里一定要注意…

    2022年4月19日
    31
  • Telerik的RadControls控件(四)

    Telerik的RadControls控件(四)朋友们、同行们通过前面《跟我学Telerik公司的RadControls控件》系列三篇的学习,你一定会内心有一种涌动,有种相见(RadControls)恨晚的感觉。那就一起加入学习RadControls控件的行列,为IT的朋友提供更加明了化的技术大餐,欢迎……  今天我将和你分享另一个更加完美的技术控件(TelerikRadTreeview)控件:  RadTreeview 是一个功

    2022年7月24日
    7
  • 阿里笔试题整理1

    阿里笔试题整理11.下面哪一个不是动态链接库的优点?(B)A.共享B.装载速度快C.开发模式好D.减少页面交换知识补充1)动态链接库:a.动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。b.使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。c.动态链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。https…

    2022年5月16日
    65
  • ASP.NET MVC 控制器激活(一)

    ASP.NET MVC 控制器激活(一)

    2021年8月30日
    50

发表回复

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

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