题意描述

 原题

  

 一句话描述:

  求第K个不是完全平方数的倍数的数。

  K≤$10^{9}$

------------------------------------------

题解:

  首先,直接求第$k$个不是完全平方数倍数的数不好求,我们不妨将它转换为一个判定问题:对于一个确定的常数$x$,他是不是第k个不是完全平方数倍数的数。这句话等价于:$[1,x]$是否有k个不是完全平方数倍数的数,这个怎么求呢?

  根据容斥原理,答案就是:0个质数乘积的平方的倍数的数量(1的倍数)- 1个质数乘积的平方的倍数的数量(4,9,25的倍数)+ 2个质数乘积的平方的倍数的数量(36,100的倍数)。

  恰好发现,$i^2$对应的符号就是$μ(i)$,所以答案就是

   那么我们二分一下$x$,就能找到答案了。二分的范围是$[1,k*2]$.

  代码实现:

  

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<algorithm>
  5. const int maxn = 1e6+;
  6. typedef long long ll;
  7. int mu[maxn],prime[maxn],vis[maxn];
  8. void init_mu(int n){
  9. int cnt=;
  10. mu[]=;
  11. for(int i=;i<n;i++){
  12. if(!vis[i]){
  13. prime[cnt++]=i;
  14. mu[i]=-;
  15. }
  16. for(int j=;j<cnt&&i*prime[j]<n;j++){
  17. vis[i*prime[j]]=;
  18. if(i%prime[j]==) {mu[i*prime[j]]=;break;}
  19. else { mu[i*prime[j]]=-mu[i];}
  20. }
  21. }
  22. }
  23. inline ll find(ll x) {
  24. ll least = sqrt(x+0.5),ans=;
  25. for(register int i=;i<=least;i++) {
  26. ans+=mu[i]*x/(1LL*i*i);
  27. }
  28. return ans;
  29. }
  30. inline ll calc(ll k) {
  31. ll l = ,r = k<<;
  32. while(l<r) {
  33. ll mid = (r+l)>>;
  34. ll temp = find(mid);
  35. #ifdef DEBUG
  36. printf("%d %d %d\n",l,r,temp);
  37. #endif
  38. if(temp<k) l=mid+;
  39. else r=mid;
  40. }
  41. return r;
  42. }
  43. int T;
  44. ll k;
  45. int main() {
  46. init_mu();
  47. scanf("%d",&T);
  48. while(T--) {
  49. scanf("%lld",&k);
  50. printf("%lld\n",calc(k));
  51. }
  52. return ;
  53. }

【BZOJ2440】[中山市选2011]完全平方数的更多相关文章

  1. BZOJ2440: [中山市选2011]完全平方数(莫比乌斯+容斥原理)

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4920  Solved: 2389[Submit][Sta ...

  2. BZOJ2440 中山市选2011完全平方数(容斥原理+莫比乌斯函数)

    如果能够知道不大于n的合法数有多少个,显然就可以二分答案了. 考虑怎么求这个.容易想到容斥,即枚举完全平方数.我们知道莫比乌斯函数就是此种容斥系数.筛出来就可以了. 注意二分时会爆int. #incl ...

  3. BZOJ2440 [中山市选2011]完全平方数

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  4. 2019.02.09 bzoj2440: [中山市选2011]完全平方数(二分答案+容斥原理)

    传送门 题意简述:qqq次询问(q≤500)(q\le500)(q≤500),每次问第kkk个不被除111以外的完全平方数整除的数是多少(k≤1e9)(k\le1e9)(k≤1e9). 思路:考虑二分 ...

  5. BZOJ2440:[中山市选2011]完全平方数(莫比乌斯函数)

    Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是 ...

  6. 题解【bzoj2440 [中山市选2011]完全平方数】

    Description 求第 \(k\) 个不含平方因子的正整数.多组询问.\(k \leq 10^9, T \leq 50\) Solution 网上的题解几乎都是容斥,这里给一个简单的也挺快的做法 ...

  7. bzoj2440 [中山市选2011]完全平方数——莫比乌斯+容斥

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2440 莫比乌斯...被难倒... 看TJ:http://hzwer.com/4827.htm ...

  8. BZOJ2440: [中山市选2011]完全平方数 容斥原理_莫比乌斯函数

    emmm....... 数学题都不友好QAQ...... Code: #include <cstdio> #include <algorithm> #include <c ...

  9. 【学术篇】bzoj2440 [中山市选2011]完全平方数

    -题目の传送门- 题目大意: 找到第k个无平方因子数. 看到数据范围很大, 我们要采用比\(O(n)\)还要小的做法. 考虑如果前\(x\)个数中有\(k-1\)个无平方因子数, 而前\(x+1\)个 ...

  10. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

随机推荐

  1. 跨域资源共享/option 请求产生原因

    https://blog.csdn.net/hfahe/article/details/7730944

  2. ajax的post请求方式

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  3. rook

    https://github.com/rook/rook https://rook.github.io/docs/rook/master/ Rook是在云本地环境中运行的分布式存储系统的开源编排器. ...

  4. Linux学习---新建文件,查看文件,修改权限,删除

    过程:在一个文件夹下面新建一个文件,然后查看文件,再修改权限,运行,最后删除 1.新建文件: touch  Test.sh 补充:新建文件有好多种方式,一般用mkdir(创建目录,即文件夹).touc ...

  5. Motion Blur

    [Motion Blur] 此篇介绍最简单的全局Motion Blur.算法是将当前帧与前一帧按某一比例混合.这是一个过程,例如有10帧,在第1帧中,只有第1帧原图,第2帧中有1.2帧原图,第3帧中会 ...

  6. ORA-01157:无法标识/锁定数据文件,ORA-01110:数据文件。。。

  7. String和CharSequence

    String 是java中的字符串,它继承于CharSequence. String类所包含的API接口非常多.为了便于今后的使用,我对String的API进行了分类,并都给出的演示程序. Strin ...

  8. Golang开发环境搭建-Vim篇

    一.一个干净的环境 找个干净的基础环境,方便确认每个搭建步骤后的效果: Ubuntu 14.04 x86_64 vim version 7.4.52 go version go1.4beta1 lin ...

  9. iOS7的iBeacon初步使用

    iBeacon是iOS7的新增的功能,通过BLE实现室内定位,精确到厘米级别. 测试使用两台iPhone(支持BLE),一台作为iBeacon基站广播信号,代码使用官方源码AirLocate,另外一台 ...

  10. Node节点部署

    一.部署kubelect 二进制包准备 将软件包从linux-node1复制到linux-node2.linux-node3中去 [root@linux-node1 ~]# cd /usr/local ...