博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2440: [中山市选2011]完全平方数
阅读量:6970 次
发布时间:2019-06-27

本文共 1090 字,大约阅读时间需要 3 分钟。

自己写的第一个博客。。。。。。。。。

BZOJ 2440

【题意】

  求第K个约数不含平方数的数 (1<=k<=10^9),

  共有T组数据(T<=50)。

【题解】

  首先题解并不是我独立思考的结果(我是蒟蒻qwq)。。。

  设f(n)表示小于等于n的满足所求数性质的数的个数,显然满足单调性,所以可以考虑二分答案吧。

  然后考虑求出f(n)。

  怎么求呢?利用容斥思想,减去含1个质数乘积平方因数的数个数,加上含2个质数乘积平方因数的数个数,再减去含三个质数乘积平方因数的数个数……

  简单来说就是n√i=1μ(i)ni2∑i=1⌊n⌋μ(i)⋅⌊ni2⌋,

  μ函数就是容斥系数,如果n的约数中同个质数的指数大于1,μ(n)值为0,含奇数个质数约数就为-1,含偶数个就为1。

  μ函数的话可以用线性筛预处理出吧。

  答案不会超过2*n,神奇啊(我是蒟蒻不会证)。。。

  时间复杂度O(T*sqrt(n))

#include <cstdio>

#include <iostream>
#define N 50010
using namespace std;
int Q,l,r,o,n,mu[N],prime[N],cnt;
bool flag[N];
void Pre()
{
mu[1]=1;
for (int i=2;i<N;++i)
{
if (!flag[i]) prime[++cnt]=i,mu[i]=-1;
for (int j=1;j<=cnt;++j)
{
if (i*prime[j]>=N) break;
flag[i*prime[j]]=1;
if (i%prime[j]==0) break;
mu[i*prime[j]]=-mu[i];
}
}
}
bool check()
{
int tot=0;
for (int i=1;i<N && (long long)i*i<=o;++i)
tot+=o/(i*i)*mu[i];
return tot>=n;
}
int main()
{
cin>>Q;
Pre();
while (Q--)
{
l=0,r=2e9;
cin>>n;
while (l<r)
{
o=((long long)l+r)>>1;
if (check()) r=o;
else l=o+1;
}
cout<<l<<endl;
}
return 0;
}

//转自lzw大神的blog

转载于:https://www.cnblogs.com/dancer16/p/6770193.html

你可能感兴趣的文章
Android从零开始(第四篇)网络框架MVP+Retrofit+Rxjava
查看>>
Android逆向从未如此简单
查看>>
从Android Studio 开始的ARCore之旅
查看>>
Android轮播图控件CustomBanner的使用讲解
查看>>
让你在服务器上顺风顺水——linux常用命令
查看>>
[iOS] [OC] NSNotificationCenter 进阶及自定义(附源代码)
查看>>
Python logging 库的『完整教程』
查看>>
springboot -- 2.0版本自定义ReidsCacheManager的改变
查看>>
应用层,了解一下
查看>>
Failed to execute aapt
查看>>
创建个人cocopods集合(仅供参考)
查看>>
OAuth2.0认证授权workflow探究
查看>>
《Android Security Internals》第二章权限翻译
查看>>
笔者介绍
查看>>
spring-cloud Sleuth
查看>>
大数据成神之路
查看>>
重新梳理下js中的深拷贝和浅拷贝
查看>>
个推Node.js 微服务实践:基于容器的一站式命令行工具链
查看>>
Taro 多端开发的正确姿势:打造三端统一的网易严选(小程序、H5、React Native)...
查看>>
105. Construct Binary Tree from Preorder and Inorder Traversal
查看>>