首先想到用二分来判断

不是平方数的倍数,即没有次数>=2的质因子
显然用容斥原理,即所有答案-1个质因子的平方的所有倍数+2个质因子的所有平方倍...
等价于对于每个数,如果它有奇数个质因子,那么其贡献系数是-1,反之则是1,

如果自己本身有平方因子(比如2*2*3),那么其贡献系数是0,因为已经被前面的筛掉了(1的时候+1,2,3的时候-1,2*3的时候+1,最后已经成为0了),根本不用去管它

那么可以发现i的系数恰好是mu[i]

其实由这题可以发现mu[i]函数的意义,即容斥系数

本题用容斥筛出i的倍数时 对应的系数恰好是 mu[i]是因为:mu[i]的本质就是来筛i的倍数的

设f(n)是原函数,g(n)是和函数

mu[p1]=-1 是因为 f(n)必须要减去一个g(n/p1)

mu[p1*p2]=1是因为 f(n)=g(n)-g(n/p1)-g(n/p2),多减掉了一个g(n/p1/p2)

mu[p1^k*p2]=0 是因为 f(n)=g(n)-g(n/p1)-g(n/p2)+g(n/p1/p2) 里 的g(n/p1^k/p2)已经被做成0了

  g(n/p1的所有倍数)系数-1,g(n/p2的所有倍数)系数-1,g(n/p1/p2)的所有倍数系数+1,所以g(n/p1/p2的所有倍数)的系数最后变成了0,包括g(n/p1/p1/p2)之类的系数

所以不需要再加减了

#define N 100000
using namespace std;
typedef long long LL;
const LL inf = (1LL<<)-;
const int MAXN = ;
LL l,r;
int ans;
int mobius[MAXN],k;
int prime[MAXN],cnt;
bool ok[MAXN]; inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} inline void init(){
mobius[]=;
for(int i=;i<=N;i++) {
if(!ok[i]) prime[++cnt]=i,mobius[i]=-;
for(int j=;j<=cnt && prime[j]*i<=N;j++) {
ok[i*prime[j]]=;
if(i%prime[j]) mobius[i*prime[j]]=-mobius[i];
else { mobius[i*prime[j]]=; break; }
}
}
} inline bool check(LL x){
LL div=sqrt(x); int tot=;
for(int i=;i<=div;i++) {
tot+=mobius[i] * (x/(i*i));
}
//tot=x-tot;
if(tot>=k) return true;
return false;
} inline void work(){
init(); int T=getint(); LL mid;
while(T--) {
k=getint(); l=; r=inf; ans=inf;
while(l<=r) {
mid=(l+r)/;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
}
} int main()
{
work();
return ;
}

二分+mu函数实质及应用(原理)!——bzoj2440好题的更多相关文章

  1. 二分检索函数lower_bound()和upper_bound()

    二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...

  2. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数

     1.指针数组 数组里面的每一个元素都是指针. 指针数组的案比例如以下: 易犯错误: 2.数组指针 归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来. 数组指针:(一个指针指向了数组.一般 ...

  3. STL二分查找函数的应用

    应用二分查找的条件必须是数组有序! 其中二分查找函数有三个binary_serch,upper_bound,lower_bound 测试数组 int n1[]={1,2,2,3,3,4,5}; int ...

  4. [探究] $\mu$函数的性质应用

    参考的神仙An_Account的blog,膜一下. 其实就是一类反演问题可以用\(\mu\)函数的性质直接爆算出来. 然后其实性质就是一个代换: \[\sum_{d|n}\mu(d)=[n=1]\] ...

  5. 【整体二分+莫比乌斯函数+容斥原理】BZOJ2440

    [题目大意] 求第k个不是完全平方数或完全平方数整数倍的数. [思路] 由于μ(i)*(n/i^2)=n,可以直接从1开始,得出非完全平方数/完全平方数倍数的数的个数 注意一下二分的写法,这里用的是我 ...

  6. BZOJ 2440 [中山市选2011]完全平方数 (二分 + 莫比乌斯函数)

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

  7. [BZOJ 2440] [中山市选2011] 完全平方数 【二分 + 莫比乌斯函数】

    题目链接:BZOJ - 2440 题目分析 首先,通过打表之类的方法可以知道,答案不会超过 2 * k . 那么我们使用二分,对于一个二分的值 x ,求出 [1, x] 之间的可以送出的数有多少个. ...

  8. 【高级】C++中虚函数机制的实现原理

    多态是C++中的一个重要特性,而虚函数却是实现多态的基石.所谓多态,就是基类的引用或者指针可以根据其实际指向的子类类型而表现出不同的功能.这篇文章讨论这种功能的实现原理,注意这里并不以某个具体的编译器 ...

  9. python基础----多态与多态性、super函数用法、继承原理

    一.多态与多态性                                                                        ㈠多态: 多态指的是一类事物有多种形态, ...

随机推荐

  1. hdu 3374 最大最小表示法 next

    题目大意: 就是求一个串的最大最小表示法的开始下标,然后求有多少个做大最小表示,输出格式为 最小表示下标 它的个数 最大表示下标 它的个数 基本思路: 最小最大表示法模板题,然后求一下循环节,很容易知 ...

  2. 使用cordova,使html5也能像IOS,Android那样可以 调取手机的相机拍照功能

    一,我们在使用html5的技术开发手机app时,并不能像IOS,Android那样可以调取手机原生的相机功能,这是我们就要借助一些插件来时实现. 二,安装Cordoba的相机插件 1.在文件目录下,使 ...

  3. C之输入输出函数(3) -- 请使用sscanf()

    #include <stdio.h> int fscanf(FILE *__restrict__stream, const char *__restrict__format-string, ...

  4. UnixBench算分介绍

    关于如何用UnixBench,介绍文章很多,这里就不展开了.这里重点描述下它是如何算分的. 运行参数 碰到很多客户,装好后,直接./Run,就把结果跑出来了,然后还只取最后一个分值,比谁高谁低.下面列 ...

  5. bzoj 3207 可持久化线段树+hash

    这道题要看出来这个做法还是比较容易说一下细节 1.因为要用hash的区间值域来建树,而hash为了不冲突要开的很大,所以值域就会比较的大,不过这道题好的一点是没有修改,所以直接离散一下就会小很多 2. ...

  6. PHP FILTER_VALIDATE_EMAIL 过滤器

    定义和用法 FILTER_VALIDATE_EMAIL 过滤器把值作为 e-mail 地址来验证. Name: "validate_email" ID-number: 274 实例 ...

  7. tarjan强连通缩点——cf711D

    模板题 #include<bits/stdc++.h> using namespace std; #define ll long long #define N 500005 #define ...

  8. 我看Spring MVC系列(一)

    1.Spring MVC是什么: Spring MVC:Spring框架提供了构建Web应用程序的全功能MVC模块. 2.Spring helloWorld应用(基于Spring 4.2) 1.添加S ...

  9. (转)VS2015基础 指定一个或多个项目执行 - 心少朴的博客

           慈心积善融学习,技术愿为有情学.善心速造多好事,前人栽树后乘凉.我今于此写经验,愿见文者得启发. 这个解决方案下,有两个项目, 看到黑体的project了吗?它就是指定执行的项目. 这两 ...

  10. 【转】Linux系统抓包命令tcpdump使用实例

    tcpdump是linux命令行下常用的的一个抓包工具,记录一下平时常用的方式,测试机器系统是ubuntu 12.04. tcpdump的命令格式tcpdump的参数众多,通过man tcpdump可 ...