@hdu - 6428@ Problem C. Calculate
@description@
给定 A, B, C,求:
\]
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@
套路反演一波:
\]
注意到其实 \((\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\)。
所以答案式变为:
\]
那么怎么快速求 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的更多相关文章
- 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 - ...
- 【HDU 6428】Calculate 莫比乌斯反演+线性筛
题解 代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 1LL&l ...
- 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 ...
- HDU 6430 Problem E. TeaTree(虚树)
Problem E. TeaTree Problem Description Recently, TeaTree acquire new knoledge gcd (Greatest Common D ...
- hdu String Problem(最小表示法入门题)
hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...
- HDU 5687 Problem C 【字典树删除】
传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...
- HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)
6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...
- HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)
6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...
- HDU 5687 Problem C(Trie+坑)
Problem C Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
随机推荐
- 小希的迷宫 HDU - 1272 (并查集)
思路: 当图中的集合(连通子图)个数为1并且边数等于顶点数-1(即改图恰好为一棵生成树)时,输出Yes. 此题的坑:(1) 如果只输入0 0算作一组数据的话答案应该输出Yes (2) 输入数据可能并不 ...
- Git同账号多平台配置
最近工作中使用到了Git,虽然以前学习过,但是已经忘的差不多了,遂将本次配置过程整理成笔记以备忘 生成公钥 ssh-keygen -t rsa -C "gana10007@163.com&q ...
- Python发送QQ消息
一.需求背景 每天早上取一批数据,数据文件经过压缩加密之后用邮箱发送,而解压密码通过QQ发送给运营.使用Python进行取数.文件加密在已经实现的情况下,需要实现通过QQ发送密码的功能. 在进 ...
- Apache-Shiro分布式环境配置(与redis集成)(转)
原文戳我 前段时间项目要用到权限控制的相关模块,经过讨论决定采用Apache下面的Shiro开源框架进行身份校验与权限控制,因项目需部署在集群环境下,所以需要分布式的支持,故配置了Redis作为权限数 ...
- ucore os 前初始化
BIOS 初始化完成说起 连接的时候指定了 -Ttext 0x7c00 也指定了 -e start 所以booasm.S 中的start 就呗钦定为程序入口了. 开始就是 屏蔽中断 初始化段寄存器 使 ...
- day18 17.c3p0连接池使用
连接池时间长不用空闲着,dbcp是不回收的,性能可能有些问题.c3p0是可以自动回收.实际开发中c3p的生产力比dbcp强,性能上更强. package cn.itcast.datasource; i ...
- (转载) poj1236 - Network of Schools
看到一篇挺好的代码,适合初学者,转载自 博主 wangjian8006 原地址:http://blog.csdn.net/wangjian8006/article/details/7888558 题目 ...
- 【模板】Vector存图 + SPFA
最近愉快地决定要由边集数组转向Vector存图,顺便开始图论集训 老惯例,以题写模板 P1339 [USACO09OCT]热浪Heat Wave 题目描述 The good folks in Texa ...
- GYM 101981E(开关反转性质)
要点 做法是删去连续的k个0或k个1,连消.消消乐的那种,网上博主用个栈\(O(n)\)就很优秀地操作了这个过程 原因是有性质:比如k=3,101000贪心地翻就能翻成000101,所以连续的k个可以 ...
- 考试总结 模拟27(W)
心得:太弱了,T1问题:理解错了题,矿石可以放到同一处,,太弱了,小凯的疑惑,没什么印象T2问题:拆式子T3问题:换根dp的思想模拟9T1+T2