首先想到用二分来判断

不是平方数的倍数,即没有次数>=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. idea 右键没有class文件的问题,,

    修改文件夹的  属性  蓝色即为java代码,,绿色为test,,等等

  2. Hive SQL之分区表与分桶表

    Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...

  3. 初试avalon

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 埃氏筛+线段树——cf731F

    从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度.. #include<bits/stdc++.h> using nam ...

  5. nodejs moment 修改时间格式 日期格式与时间戳格式互相转化

    node js moment 修改时间格式 日期格式与int格式互相转化 nvm use 8.3 > moment = require('moment') > days = '2019-0 ...

  6. diji模板

    void diji(int x){ fill(dis,dis+n,INT_MAX); dis[x] = ; ;i < n;i++) pre[i] = i; ){ int minn = INT_M ...

  7. JAVA常用集合解析

    ArrayList : 底层基于数组实现,在使用add方法添加元素时,首先校验集合容量,将新添加的值放入集合尾部并进行长度加一,进行自动扩容,扩容的操作时将数据中的所有元素复制到新的集合中. 在指定位 ...

  8. CSS:CSS 尺寸 (Dimension)

    ylbtech-CSS:CSS 尺寸 (Dimension) 1.返回顶部 1. CSS 尺寸 (Dimension) CSS 尺寸 (Dimension) 属性允许你控制元素的高度和宽度.同样,它允 ...

  9. EF 关键字

    https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/query-keywords 子句 说明 from ...

  10. C++——decltype

    , &cj=ci; decltype(ci) x=;//x的类型是const int decltype(cj) y=x;//y的类型是const int & decltype(cj) ...