题目

【问题描述】
企鹅国数学家 QQ 潜心研究数论,终于发现了一个简单的数论问题!
一个 QQ 数定义为一个拥有一个大于 $ 1 $ 的完全平方数为因子的数字,一个数字的 QQ 值定义为这个数是 QQ 数的因数个数。
现在 QQ 想知道在 $[L,R]$ 范围内,每个整数的 QQ 值之和是多少?
你只需要告诉他这个数字,他就可以给你宝贵的 $ 10 $ 分作为一个奖励!
【输入格式】
第一行两个整数 $ L, R $ 代表要求的数字范围;
【输出格式】
输出一个整数表示 `L~R` 里每个数字的 QQ 值之和。
【输入样例】
1 10
【输出样例】
4
【样例说明】
4 的 QQ 值为 1,8 的 QQ 值为 2,9 的 QQ 值为 1。
【数据范围】
对于 $ 10\% $ 的数据,$ R\leq 10^4 $;
对于另外 $ 30\% $ 的数据,$ R\leq 10^6 $;
对于另外 $ 10\% $的数据,$ R \leq 10^7 $;
对于 $ 100\% $的数据,$ 1 \leq L\leq R \leq 10^9 $;

题解

因为 $ \mu(i) $ 含有平方因子的值为0,于是可以巧妙利用这个性质

记 $ [1,n] $ 的值为
$\ \ \ \ \sum_{i=1}^{n} \sum_{d|i}[1-\mu(d)] $
$ =\sum_{d=1}^n[1-\mu(d)^2] \lfloor \frac{n}{d} \rfloor $
$ =\sum_{d=1}^n \lfloor \frac{n}{d} \rfloor - \sum_{d=1}^n \lfloor \frac{n}{d} \rfloor \mu(d)^2 $

然后可以发现前面的 $ \sum_{d=1}^n \lfloor \frac{n}{d} \rfloor $ 可以分块,但后面的 $ \sum_{d=1}^n \lfloor \frac{n}{d} \rfloor \mu(d)^2 \ n \leq 10^9 $,没有办法预处理

考虑 $ \sum_{d=1}^n \lfloor \frac{n}{d} \rfloor \mu(d)^2 $ 的几何意义

$ \sum_{d=1}^n \lfloor \frac{n}{d} \rfloor \mu(d)^2 = n- \lfloor \frac{n}{2} \rfloor - \lfloor \frac{n}{3} \rfloor -\lfloor \frac{n}{5} \rfloor + \lfloor \frac{n}{6} \rfloor +... $

可以发现当 $ i> \sqrt{n} $ 时 $ \lfloor \frac{n}{i} \rfloor = 0$

所以只要枚举到 $ \sqrt{n} $ 时即可(其实还是可以分块优化的)

然后就可以在 $ O(\sqrt{n}) $ 完成

再附一种做法:

$ -\sum_{i=2}^{\sqrt{n}}\mu(i)\sum_{j=1}^{\lfloor \frac{n}{i^2 j} \rfloor} \lfloor \frac{n}{i^2 j} \rfloor $ 直接分块即可

代码

 #include<bits/stdc++.h>
#define LL long long
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
int R(){
int x;bool f=;char ch;_(!)if(ch=='-')f=;x=ch^;
_()x=(x<<)+(x<<)+(ch^);return f?x:-x;}
const int N=1e7+;
int p[N],vis[N],mu[N],l,r,tot;
LL make(int n){
LL ans=;
for(int i=;i*i<=n;i++)
ans+=mu[i]*(n/(i*i));
return ans;
}
LL work(int n){
LL ans=,res=;
for(int i=,l;i<=n;i=l+)
l=n/(n/i),ans+=(n/i)*(l-i+);
for(int i=,l;i<=n;i=l+)
l=n/(n/i),res+=(n/i)*(make(l)-make(i-));
return ans-res;
}
int main(){
mu[]=;
for(int i=;i<N;i++){
if(!vis[i])p[++tot]=i,mu[i]=-;
for(int j=;j<=tot&&p[j]*i<N;j++){
vis[i*p[j]]=;
if(i%p[j]==)break;
mu[i*p[j]]=-mu[i];
}
}
l=R(),r=R();
printf("%lld\n",work(r)-work(l-));
return ;
}

2019-03-20

QQ 数(number.pas/c/cpp)——莫比乌斯函数的更多相关文章

  1. bzoj2440(莫比乌斯函数)

    bzoj2440 题意 求第 k 个不是完全平方数(除 1 以外)的正倍数的数. 分析 利用二分法求解,二分 x ,判断 x 是否是第 k 个数即可,那么我们就要计算 [1, x] 有几个符合条件的数 ...

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

    题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 题意即求第\(k\)个无平方因子数. 无平方因子数(Square-Free Number),即分解之后所有质因 ...

  3. HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法

    题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd( ...

  4. 2017 ACM暑期多校联合训练 - Team 3 1008 HDU 6063 RXD and math (莫比乌斯函数)

    题目链接 Problem Description RXD is a good mathematician. One day he wants to calculate: ∑i=1nkμ2(i)×⌊nk ...

  5. hdu 1965 (莫比乌斯函数 莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. Relatively Prime Powers CodeForces - 1036F (莫比乌斯函数容斥)

    Relatively Prime Powers CodeForces - 1036F Consider some positive integer xx. Its prime factorizatio ...

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

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

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

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

  9. 数学(莫比乌斯函数):BZOJ 2440 完全平方数

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

随机推荐

  1. px sp dp 手机尺寸

  2. 【Leetcode-easy】Remove Nth Node From End of List

    思路1:设置两个指针p1,p2指向表头,p1先走n步.再两个指针同时走.当p1指针指到链表尾部时,P2指针已经在需要删除节点的前一位.一定要注意一些细节. class ListNode { int v ...

  3. nodejs搭建简单的websocket服务端

    创建websocket服务端使用了nodejs-websocket ,首先要安装nodejs-websocket,在项目的目录下: npm install nodejs-websocket 1.搭建w ...

  4. windows server 2008 r2 下发布网站excel有时候无法下载文档

    最近将公司网站服务器更新了系统,从win2003 到 win2008 r2 (64bit),一切正常,但是使用网站的过程中发现了一个比较奇怪的问题,就是,有时候网站的excel文档无法下载,但是我什么 ...

  5. struts2 自定义类型转化 第三弹

    1.Struts2的类型转化,对于8种原生数据类型以及Date,String等常见类型,Struts2可以使用内建的类型转化器实现自动转化:但对于自定义的对象类型来说,就需要我们自己指定类型转化的的方 ...

  6. __declspec(dllimport)的小秘密(转)

    昨天和同事使用一个dll(lib+dll)的时候,发现他在引用头文件是,并没有使用__declspec(dllimport),但是程序完全运行正常,不明觉厉下,去网上翻了下资料,原来是链接器的原因,这 ...

  7. 【boost】使用serialization库序列化子类

    boost.serialization库是一个非常强大又易用的序列化库,用于对象的保存与持久化等. 使用base_object可以在序列化子类的同时也序列化父类,以此获得足够的信息来从文件或网络数据中 ...

  8. 「UVA1636」Headshot(概率

    题意翻译 你有一把枪(左轮的),你随机装了一些子弹,你开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"SHOOT"),还是先转一下,再开一枪(输出&quo ...

  9. 【运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

    一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffm ...

  10. 解析Monte-Carlo算法(基本原理,理论基础,应用实践)

    引言 最近在和同学讨论研究Six Sigma(六西格玛)软件开发方法及CMMI相关问题时,遇到了需要使用Monte-Carlo算法模拟分布未知的多元一次概率密度分布问题.于是花了几天时间,通过查询相关 ...