题意:

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

\(g(n)=\sum_{d|n}f(d)\),求\(g(n) \; mod \; 2^{64}\),其中\(1 \leq n \leq 10^9\)

仰慕叉老师手推公式

分析:

计算\(f(n)\)

\(f(n)\)不容易计算,但可以计算它的反面,也就是计算满足\(ij \equiv 0 \; (mod \; n)\)的数对\((i,j)\)的个数。

为了方便计算,对\(i,j\)的范围稍作改动,\(1 \leq i,j \leq n\),这不会影响最终计算结果。

\(i \cdot j\)是\(n\)的整数倍,也就是\(n\)被分到了这里面。

不妨设\(i=ax,j=by\),其中\(ab=n\)。我们可以枚举\(a\)来统计答案,但是这样有重复计算。

比如\((3 \cdot 2) \cdot (2 \cdot 1) = (6 \cdot 1) \cdot (2 \cdot 1) = 6 \cdot 2\),这样数对\((6, 2)\)在\(a=3\)和\(a=6\)时被计算了两次。

所以计数时我们规定,数对\((i,j)\)只会在\(a\)最大的时候被计算,所以有\(gcd(b,x)=1\)成立。

答案为\(\sum\limits_{a|n} \sum\limits_{1 \leq x \leq \frac{n}{a}}[gcd(x,b)=1] \cdot \frac{n}{b}=\sum\limits_{a|n}a \phi(\frac{n}{a})\)

计算\(g(n)\)

根据题中给的关系,得到\(g(n)=\sum\limits_{m|n}(m^2-f(m))=\sum\limits_{m|n}(m^2-\sum\limits_{d|m}d \phi(\frac{m}{d}))\)

继续化简后面那部分,\(\sum\limits_{m|n}\sum\limits_{d|m}d \phi(\frac{m}{d})\)交换求和顺序,得到\(\sum\limits_{d|n}d\sum\limits_{\frac{m}{d}|\frac{n}{d}}\phi(\frac{m}{d})\)

由于\(\sum\limits_{d|n} \phi(d)=n\),所以得到\(\sum\limits_{d|n}d \cdot \frac{n}{d}=n\sum\limits_{d|n}1=n \sigma(n)\)。其中\(\sigma(n)\)为\(n\)的约数的个数。

\(\sigma(n)\)可以这样计算:

首先将\(n\)质因数分解为\(\prod\limits_{i=1}^{r}p_{i}^{e_i}\),这样\(\sigma(n)=\prod\limits_{i=1}^{r}(e_i+1)\)。

因为我们已经将\(n\)分解,所以计算前面那部分的时候不要在\(\sqrt{n}\)内枚举\(n\)的约数,会超时的。要根据分解出来的结果直接枚举。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std; const int maxn = 32000 + 10;
int pcnt, prime[maxn];
bool vis[maxn]; void preprocess() {
for(int i = 2; i < maxn; i++) {
if(!vis[i]) prime[pcnt++] = i;
for(int j = 0; j < pcnt && i * prime[j] < maxn; j++) {
vis[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
} int tot, p[maxn], e[maxn]; unsigned long long ans;
void dfs(int d, unsigned long long product) {
if(d == tot) {
ans += product * product;
return ;
} dfs(d + 1, product);
for(int i = 1; i <= e[d]; i++) {
product *= p[d];
dfs(d + 1, product);
}
} int main()
{
preprocess();
int T; scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n); int t = n;
tot = 0;
for(int i = 0; i < pcnt && prime[i] * prime[i] <= n; i++) {
if(t % prime[i] == 0) {
p[tot] = prime[i];
e[tot] = 0;
while(t % prime[i] == 0) {
t /= prime[i];
e[tot]++;
}
tot++;
}
}
if(t > 1) { p[tot] = t; e[tot++] = 1; } unsigned long long tmp = 1;
for(int i = 0; i < tot; i++) tmp = tmp * (e[i] + 1);
tmp *= n; ans = 0;
dfs(0, 1); ans -= tmp; printf("%llu\n", ans);
} return 0;
}

HDU 5528 Count a * b 欧拉函数的更多相关文章

  1. HDU 4483 Lattice triangle(欧拉函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4483 题意:给出一个(n+1)*(n+1)的格子.在这个格子中存在多少个三角形? 思路:反着想,所有情 ...

  2. hdu 2824 The Euler function(欧拉函数)

    题目链接:hdu 2824 The Euler function 题意: 让你求一段区间的欧拉函数值. 题解: 直接上板子. 推导过程: 定义:对于正整数n,φ(n)是小于或等于n的正整数中,与n互质 ...

  3. HDU - 2824 The Euler function 欧拉函数筛 模板

    HDU - 2824 题意: 求[a,b]间的欧拉函数和.这道题卡内存,只能开一个数组. 思路: ϕ(n) = n * (p-1)/p * ... 可利用线性筛法求出所有ϕ(n) . #include ...

  4. HDU 4002 Find the maximum(欧拉函数)

    题目链接 猜了一个结论,题面跟欧拉函数有关系. import java.util.*; import java.math.*; import java.text.*; import java.io.* ...

  5. HDU 1695 GCD (容斥原理+欧拉函数)

    题目链接 题意 : 从[a,b]中找一个x,[c,d]中找一个y,要求GCD(x,y)= k.求满足这样条件的(x,y)的对数.(3,5)和(5,3)视为一组样例 . 思路 :要求满足GCD(x,y) ...

  6. HDU 3501 Calculation 2 (欧拉函数)

    题目链接 题意 : 求小于n的数中与n不互质的所有数字之和. 思路 : 欧拉函数求的是小于等于n的数中与n互质的数个数,这个题的话,先把所有的数字之和求出来,再减掉欧拉函数中所有质数之和(即为eula ...

  7. HDU 3501 Calculation 2(欧拉函数)

    Calculation 2 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  8. hdu 1695 GCD 容斥+欧拉函数

    题目链接 求 $ x\in[1, a] , y \in [1, b] $ 内 \(gcd(x, y) = k\)的(x, y)的对数. 问题等价于$ x\in[1, a/k] , y \in [1, ...

  9. hdu 2824 The Euler function 欧拉函数打表

    The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

随机推荐

  1. FloatHelper

    function FloatHelper() { } FloatHelper.prototype.showFloater = function (Target, Title, Action, Acti ...

  2. 用canvas裁剪图片

    var selectObj = null; function ImageCrop(canvasId, imageSource, x, y, width, height) { var canvas = ...

  3. 7.Solution的Build、Rebuild和Clean

    大家好,我是原文,这篇随笔是对原文的翻译以及自己的体会. 做程序员没追求的话是永远找不到女朋友的,当然有追求也找不到,这个先不提,好在有追求的时候我是充实而且开心的.现在我们的问题是,每天调试项目,在 ...

  4. IO(转换流、缓冲流)

    第1章 转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者Output ...

  5. JavaScript中var a=b=c=d的发现

    看了别人的博客随手记录下 先看一下以下的代码 var a=1,b=2,c=3; (function(){ var a=b=1; })(); console.log(a); console.log(b) ...

  6. C#调用C++接口返回字符串的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 现在有这样一种情景,假如C#调用C++接口需要返回一个字符串.因为字符串是不定长的,因此传递一个定长的字符串进去是不合 ...

  7. wpf ListBox删除选择项(支持多项)

    搞了个ListBox删除选择项,开始老是不能把选择项删除干净,剩下几个.后来调试一下原来是ListBox在删除一个选择项之后立即更新,选择项也有变化.结果我想了个这样的方法来删除呵呵. Departm ...

  8. Linux中根据访问日志统计访问量最高的前N个IP

    前段时间面试中被问到如上问题,日常不怎么注意积累,以此谨记. 访问IP 页面[nxuser@im440-zh test]$ vi log 135.252.172.181 page1 136.252.1 ...

  9. C#实现灰度图像和彩色图像的4种镜像

    一:灰度图像的水平镜像核心代码:  二:灰度图像的竖直镜像 核心代码:三:彩色图像的水平镜像 核心代码: 四:彩色图像的竖直镜像 核心代码: 

  10. Windows环境下使用Apache+mod

    1.安装Python和Apache. 2.安装mod_wsgi后获得wsgi.so,并将wsgi.so放到Apache的modules文件夹下. 3.安装webpy. 4.打开httpd.conf(在 ...