@description@

给定 A, B, C,求:

\[\sum_{i=1}^{A}\sum_{j=1}^{B}\sum_{k=1}^{C}\phi(gcd(i, j^2, k^3))\mod 2^{30}
\]

Input

第一行给定一个整数 T,描述数据组数。

接下来每组数据包含三个整数 A, B, C,含义如上。

1 ≤ T ≤ 10, 0 < A, B, C ≤ 10^7

Output

对于每组数据,输出答案 mod 2^30。

Sample Input

4

96 93 95

970 906 893

92460 95043 54245

9760979 8053227 7156842

Sample Output

1114536

28070648

388873924

623507672

@solution@

套路反演一波:

\[ans = \sum_{d=1}\phi(d)*(\sum_{d|p}\mu(\frac{p}{d})*(\sum_{i=1}^{A}[p|i])*(\sum_{j=1}^{B}[p|j^2])*(\sum_{k=1}^{C}[p|k^3]))
\]

注意到其实 \((\sum_{i=1}^{A}[p|i]) = \lfloor\frac{A}{p}\rfloor\),是比较好求解的,但是另外两项不能直接这么类比着做。

考虑从唯一分解式的角度去理解。令 \(p = \prod_{i=0}a_i^{b_i}, j = \prod_{i=0}a_i^{c_i}\)。

如果 \(p|j^2\),则有 \(b_i \le 2c_i\),于是 \(\lceil\frac{b_i}{2}\rceil \le c_i\)。

我们令 \(f[p] = \prod_{i=0}a_i^{\lceil\frac{b_i}{2}\rceil}\),则条件等价转为 \(f[p]|j\)。类比得到 \(g[p]\) 的定义以及 \(g[p]|k\)。

所以答案式变为:

\[ans = \sum_{d=1}\phi(d)*(\sum_{d|p}\mu(\frac{p}{d})*\lfloor\frac{A}{p}\rfloor*\lfloor\frac{B}{f[p]}\rfloor*\lfloor\frac{C}{g[p]}\rfloor
\]

那么怎么快速求 f[p] 或 g[p] 呢?可以发现 \(f[p] = \prod_{i=0}f[a_i^{b_i}]\),也就是说它是积性函数。

所以我们就使用线性筛任意积性函数的技巧即可。这里有一个可以参考的连接

我实现上跟那个博客写得不大一样(不过思想是一致的嗯嗯)。

然后我们考虑 \(\sum_{d=1}\phi(d)*\mu(\frac{p}{d})\),发现它是两个积性函数的狄利克雷卷积,而众所周知这也是个积性函数。

然后就可以愉快地再次任意函数线性筛一波。

最后枚举 p 算答案。时间复杂度 O(n)。

@accepted code@

#include<cstdio>
const int MOD = (1<<30) - 1;
const int MAXN = int(1E7);
inline int mul(int a, int b) {return (1LL*a*b)&MOD;}
int prm[MAXN + 5], pcnt = 0;
int low[MAXN + 5], f[MAXN + 5], g[MAXN + 5], h[MAXN + 5];
void sieve() {
low[1] = f[1] = g[1] = h[1] = 1;
for(int i=2;i<=MAXN;i++) {
if( !low[i] ) {
low[i] = i, prm[++pcnt] = i;
f[i] = i - 2, g[i] = h[i] = i;
long long p = 1LL*i*i;
for(int j=2;p<=MAXN;p*=i,j++) {
low[p] = p;
f[p] = p/i/i*(i-1)*(i-1);
g[p] = g[p/i];
if( (j-1) % 2 == 0 ) g[p] *= i;
h[p] = h[p/i];
if( (j-1) % 3 == 0 ) h[p] *= i;
}
}
for(int j=1;1LL*i*prm[j]<=MAXN;j++) {
if( i % prm[j] == 0 ) {
if( i != low[i] ) {
low[i*prm[j]] = low[i]*prm[j];
f[i*prm[j]] = f[i/low[i]]*f[prm[j]*low[i]];
g[i*prm[j]] = g[i/low[i]]*g[prm[j]*low[i]];
h[i*prm[j]] = h[i/low[i]]*h[prm[j]*low[i]];
}
break;
}
else {
low[i*prm[j]] = prm[j];
f[i*prm[j]] = f[i]*f[prm[j]];
g[i*prm[j]] = g[i]*g[prm[j]];
h[i*prm[j]] = h[i]*h[prm[j]];
}
}
}
}
void solve() {
int A, B, C, ans = 0; scanf("%d%d%d", &A, &B, &C);
for(int i=1;i<=A;i++)
ans = (1LL*ans + 1LL*mul(mul(f[i], A/i), mul(B/g[i], C/h[i])))&MOD;
printf("%d\n", ans);
}
int main() {
sieve();
int T; scanf("%d", &T);
for(int i=1;i<=T;i++) solve();
}

@details@

因为是对 2^30 取模,所以可以用位运算加速(虽然我不知道能加到多快,不过应该挺快的)。

@hdu - 6428@ Problem C. Calculate的更多相关文章

  1. HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

    6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...

  2. 【HDU 6428】Calculate 莫比乌斯反演+线性筛

    题解 代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 1LL&l ...

  3. HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  4. HDU 6430 Problem E. TeaTree(虚树)

    Problem E. TeaTree Problem Description Recently, TeaTree acquire new knoledge gcd (Greatest Common D ...

  5. hdu String Problem(最小表示法入门题)

    hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...

  6. HDU 5687 Problem C 【字典树删除】

    传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...

  7. HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)

    6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...

  8. HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)

    6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...

  9. HDU 5687 Problem C(Trie+坑)

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

随机推荐

  1. io.spring.platform继承方式和import方式更改依赖版本号的问题

    使用io.spring.platform时,它会管理各类经过集成测试的依赖版本号. 但有的时候,我们想使用指定的版本号,这个时候就需要去覆盖io.spring.platform的版本号. 前面的文章总 ...

  2. IO流7 --- FileWriter写出数据的操作 --- 技术搬运工(尚硅谷)

    FileWriter字符输出 @Test public void test3(){ File file = new File("hello1.txt"); FileWriter f ...

  3. 【洛谷P1207】双重回文数 【USACO1.2】

    P1207 [USACO1.2]双重回文数 Dual Palindromes 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做"回文数".例如,12321就是一 ...

  4. PHP把图片保存到数据库,将图片本身保存在数据库,而非保存路径

    备注 百度开发者的云代码空间为了保证高可用,不允许用户将图片保存到代码空间中,使用CDN或者对象存储不仅收费而且使用比较复杂,于是考虑能否将img存储在数据库中,虽然很多人说会造成性能问题,权当一试 ...

  5. 【python之路19】文件操作

    一.打开文件 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ...

  6. Git clone远程仓库

    git clone git@ip地址:/home/git_data/wechat.git

  7. Android 程序员不得不收藏的个人博客(持续更新...)

    本文已收录我的 Github ,持续更新中 ,欢迎点赞 ! 每周打开一次收藏夹里的个人博客,已经成为了我的人生一大乐趣. 相比各大博客平台,我一直更加偏爱个人博客.在每个人自己的这一亩三分地里,你能看 ...

  8. webserver的性能问题,一语道破真谛

    一直纠结我们要大减的paas平台需要支持多大的并发数. 看到一个网友所说的,恍然大悟,按原有我的理解和要求,并发达到w级 req/s,已经是非常高的要求了,单纯从软件上是很难实现的,一定要以来硬件上的 ...

  9. 【python小随笔】Django+错误日志(配置Django报错文件指定位置)

    1:  自定义日志文件.py----------几个文件需要创建日志,就需要重新定义几份 # 定义一个日志文件 创建一个操作日志对象logger file_1 = logging.FileHandle ...

  10. 继续对dubbo源代码进行maven builder

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/enson16855/article/details/32073981 原文地址:http://dtb ...