@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. Codeforces Round #573 (Div. 2)

    A:Tokitsukaze and Enhancement 当时看错条件了..以为A>C>B>D.就胡写了判断条件. #include<bits/stdc++.h> us ...

  2. flexget安装

    首先新建一个文件夹给flexget下载种子 Flexgetdownloads 注意:如果先安装flexget再创建文件夹则需要手动去分配权限 然后通过勾选我要试用beta版本,来获取flexget 找 ...

  3. java swing调试时线程显示名字

    一般有一个默认名字 但是具体运行到哪一个线程,需要猜 为了节约时间,提高效率 可以给线程写个中文名(因为默认就是英文,写中文,一眼就能挑出来) 以RTC定时器为例子 final TimerRtc ti ...

  4. python基础--文件相关操作

    文件操作方式的补充: “+”表示的是可以同时读写某个文件 r+:可读可写 w+:可读可写 a+:可读可写 x:只写模式[不可读:不存在则创建,存在则报错] x+:可读可写 文件内的光标移动: 1.re ...

  5. python实例 输出字符串和数字

    但有趣的是,在javascript里我们会理想当然的将字符串和数字连接,因为是动态语言嘛.但在Python里有点诡异,如下: #! /usr/bin/python a=2 b="test&q ...

  6. Hibernate_添加联系人练习

    分析: 联系人与客户是多对一,一个客户(公司)有多个联系人,在多的这一方,即LinkMan, 1.LinkMan.java中除自身属性外,还需要 2.在hbm.xml文件中,加上 意思是建立一个外键用 ...

  7. 洛谷P1970 [NOIP2013提高组Day2T2] 花匠

    P1970 花匠 题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排 ...

  8. LUOGU P2964 [USACO09NOV]硬币的游戏A Coin Game

    题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...

  9. JS---案例:旋转木马

    案例:旋转木马 页面加载时候出现的效果,script标签写在head里面,body上面 显示一个图片散开的动画,遍历之后,把每个图片用封装的动画函数移动到指定目标(同时改变多属性:宽,透明度,层级,t ...

  10. WPF/Silverlight深度解决方案:(七)HLSL自定义渲染特效之完美攻略(中)

    原文:WPF/Silverlight深度解决方案:(七)HLSL自定义渲染特效之完美攻略(中) 通过上一节的解说,大家是否已经对HLSL有了较深刻的认识和理解,HLSL的渲染不仅仅局限于静态处理,通过 ...