$f(m)=\sum\limits_{i=1}^{m-1}\sum\limits_{j=1}^{m-1}[(ij,m) \ne m]$,$g(n)=\sum\limits_{m|n}f(m)$,$1 \le n \le 10^9$,求$g(n)$模$2^{64}$。

要求为$i j ∤ m$,说明$ij$不为$m$的倍数,但是可以有公共因子,直接求很麻烦,不如先反着来求不符合的,最后再减掉。然后就是化式子,枚举一个数$(m, i)=d$,则另一个数满足$\frac{m}{d}|j$,二者各自有$\varphi(\frac{m}{d})$和$d$个数量,继续化简,之后可以观察到右半式就是某很经典的欧拉函数的结论,然后预处理素数,素因子分解计算下贡献,最后左右两个半式相减就行了。

\begin{eqnarray*} g(n) &=& \sum\limits_{m|n}(m^2-\sum\limits_{i=1}^{m-1}\sum\limits_{j=1}^{m-1}[(ij,m) = m]) \newline &=&\sum\limits_{m|n} {m^2} - \sum\limits_{m|n} \sum\limits_{d|m} d\varphi \left( \frac{m}{d} \right) \newline &=& \sum\limits_{m|n} {m^2} - \sum\limits_{d|n}d {\sum\limits_{\frac{m}{d}|\frac{n}{d}} {\varphi \left( {\frac{m}{d}} \right)} } \newline &=& \sum\limits_{m|n} {m^2} - \sum\limits_{d|n}{d \frac{n}{d}} \newline &=& \sum\limits_{m|n} {m^2} - n \sum\limits_{d|n}{1} = \sum\limits_{m|n} {m^2} - n \tau(n) \end{eqnarray*}

还有另外一种方法就是直接利用积性函数的性质,再用欧拉函数化简。得到的最后式子是一样的。

/** @Date    : 2017-10-20 14:18:28
* @FileName: HDU 5528 反演.cppc
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL unsigned long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 5e4+20;
const double eps = 1e-8; LL pri[N];
bool vis[N];
int c = 0; void prime()
{
MMF(vis);
for(int i = 2; i < N; i++)
{
if(!vis[i]) pri[c++] = i;
for(int j = 0; j < c && i * pri[j] < N; j++)
{
vis[i * pri[j]] = 1;
if(i % pri[j] == 0) break;
}
}
} int main()
{
prime();
int T;
scanf("%d", &T);
while(T--)
{
LL n;
scanf("%llu", &n);
LL t = n;
LL sum = 1ULL, dis = 1ULL;
for(int i = 0; i < c && pri[i] * pri[i] <= t; i++)
{
if(t % pri[i] == 0)
{
LL cnt = 1;
LL tmp = 1ULL;
LL k = 1ULL;
while(t % pri[i] == 0)
t /= pri[i], cnt++; for(int j = 0; j < cnt - 1; j++)
{
tmp *= pri[i];
k += (LL)tmp * tmp;// ()* m^2
}
sum *= k;
dis *= cnt;
}
}
if(t > 1)
{
sum *= t * t + 1;
dis *= 2ULL;
}
dis *= n;
printf("%llu\n", sum - dis);
}
return 0;
}

HDU 5528 反演的更多相关文章

  1. 2015ACM/ICPC亚洲区长春站 B hdu 5528 Count a * b

    Count a * b Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tot ...

  2. HDU 5528 Count a * b 欧拉函数

    题意: 定义函数\(f(n)\)为\(i \cdot j \not\equiv 0 \; (mod \; n)\)的数对\((i,j)\)的个数\((0 \leq i,j \leq n)\) \(g( ...

  3. HDU 5514 Frogs 欧拉函数

    题意: 有\(m(1 \leq m \leq 10^9)\)个石子排成一圈,编号分别为\(0,1,2 \cdots m-1\). 现在在\(0\)号石头上有\(n(1 \leq n \leq 10^4 ...

  4. HDU 2841 Visible Trees(莫比乌斯反演)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2841 题意:给n*m的矩阵(从(1,1)开始编号)格子,每个格子有一棵树,人站在(0,0)的位置,求可 ...

  5. HDU 5321 Beautiful Set (莫比乌斯反演 + 逆元 + 组合数学)

    题意:给定一个 n 个数的集合,然后让你求两个值, 1.是将这个集合的数进行全排列后的每个区间的gcd之和. 2.是求这个集合的所有的子集的gcd乘以子集大小的和. 析:对于先求出len,len[i] ...

  6. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

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

  7. HDU 2841 容斥 或 反演

    $n,m <= 1e5$ ,$i<=n$,$j<=m$,求$(i⊥j)$对数 /** @Date : 2017-09-26 23:01:05 * @FileName: HDU 284 ...

  8. hdu 4676 Sum Of Gcd 莫队+phi反演

    Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...

  9. HDU 6134 Battlestation Operational(莫比乌斯反演)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6134 [题目大意] 求$\sum_{i=1}^{n}{\sum_{j=1}^{i}\lceil{\ ...

随机推荐

  1. javascript source map 的使用

    之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大意 ...

  2. 创建并使用maven archetype的随笔

    maven骨架archetype的意义在于一些项目的基础项:如引入的maven组件,例如eureka,ribben等,不希望每次新建项目都重复做一遍,还有例如公司规范的log格式,单元测试工具等,在新 ...

  3. mac 安装 tomcat 配置

    前面的话:记录下 Mac 安装配置 Tomcat 过程 1. 下载安装 Tomcat 下载 Tomcat 地址(官方地址):https://tomcat.apache.org/download-80. ...

  4. 20181204-4 互评Final版本

    此次作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2478 互评 一.互评Final版本——杨老师粉丝群<PinBall ...

  5. 《Linux内核分析》第四周笔记 扒开系统调用的三层皮(上)

    扒开系统调用的三层皮(上) 一.用户态.内核态和中断 库函数将系统调用封装起来. 1.什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别. 在高执行级别下,代码可以执行特权指令,访问任意的 ...

  6. C++:继承访问属性(public/protected/private)

    • 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...

  7. 构建之法-软件测试+质量保障+稳定和发布阶段+IT行业的创新+人、绩效和职业道德

    第十三章(软件测试) 要知道为什么有软件测试,首先需要知道软件开发,软件开发者一般都很难检查出自己的错误,所以才需要另外一个人测试,所以软件测试就诞生了. 书本介绍了很多测试方法,各有各的优缺点,至于 ...

  8. week3 团队博客作业

    团队自我介绍地址: http://www.cnblogs.com/liuliudashun/p/5919555.html

  9. PAT 甲级 1110 Complete Binary Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805359372255232 Given a tree, you are ...

  10. Linux命令(二十五) 磁盘管理命令(三) fdisk

    一.fdisk命令介绍 fdisk 为Linux系统下的分区管理工具,类型windows下的 分区助手等工具软件.分过区装过操作系统的人都知道硬盘分区是必要和重要的.fdisk 的帮助如下所示: [r ...