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

阅读: 评论:0

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;

       

代码:

/******************************************************
* @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 (&#" , "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;elseright=middle-1;}cout<<left<<'n';}return 0;
}

转载于:.html

本文发布于:2024-01-28 07:40:33,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063988395853.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:乌斯
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23