P4619 [SDOI2018]旧试题

题意:

求个式子:
(∑i=1A∑j=1B∑k=1Cd(i∗j∗k))mod(109+7)(\sum_{i=1}^{A}\sum_{j=1}^{B}\sum_{k=1}^{C}d(i*j*k))mod(10^9+7)(i=1∑A​j=1∑B​k=1∑C​d(i∗j∗k))mod(109+7)

题解:

原创博文1k纪念


很明显,莫比乌斯反演
马上更新




三元环链接
此等好题,作为第1000题的纪念

代码:

这个题让我写,我是真写不出来,非常适合练练莫比乌斯推导
代码条例非常清晰,很适合阅读

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N= 1e5 + 7;
const int M= 1e6 + 7;
const int mod= 1e9 + 7;
bool Prime[N];
int tot, P[N >> 3], mu[N];
void get_mu()
{mu[1]= 1;for (int i= 2; i <= 1e5; i++) {if (!Prime[i])P[++tot]= i, mu[i]= -1;for (int j= 1; P[j] * i <= 1e5 && j <= tot; j++) {Prime[P[j] * i]= 1;if (i % P[j] == 0) {mu[P[j] * i]= 0;break;}mu[P[j] * i]= -mu[i];}}
}
vector<int> ve[N];
unordered_map<int, bool> mp[N];
int T, Max, A, B, C, ans, p[N];
int sA[M], sB[M], sC[M], cnt, deg[N];
int gcd(int x, int y)
{return x == 0 ? y : gcd(y % x, x);
}
ll lcm(int x, int y)
{return 1ll * x / gcd(x, y) * y;
}
int ta, tb, tc, sum;
void cal(int a, int b, int c)//求后半程三个累加的答案
{sum=(sum+ 1ll * p[a / ta] * p[b / tb] % mod * p[c / tc] % mod)% mod;
}
void get(int a, int b, int c)
{sum= 0;if (a == b && b == c)cal(A, B, C);else if (a == b || b == c || c == a) {cal(A, B, C);cal(C, A, B);cal(B, C, A);}else {//三个点的值都不一样,完全排列 cal(A, B, C);cal(A, C, B);cal(B, A, C);cal(B, C, A);cal(C, A, B);cal(C, B, A);}//记录后半程的答案 ans= (ans + (mu[a] * mu[b] * mu[c] * sum % mod + mod) % mod) % mod;//记录前半程答案
}
int vis[N];
void solve()
{for (int i= 1; i <= cnt; i++) { int &u= sA[i], &v= sB[i];if (deg[u] < deg[v])swap(u, v);else if (deg[u] == deg[v] && u > v)swap(u, v);ve[u].push_back(i);//存的点的编号,为了方便后面取值 }for (int i= 1; i <= Max; i++) {//跑三元环 for (int j : ve[i])vis[sB[j]]= sC[j];for (int j : ve[i])for (int k : ve[sB[j]])if (vis[sB[k]]) {ta= vis[sB[k]];//分别是三个lcm tb= sC[j];tc= sC[k];get(i, sB[j], sB[k]);//三个点的值 }for (int j : ve[i])vis[sB[j]]= 0;}
}
void getans(int x)
{for (int l= 1, r; l <= x; l= r + 1) {r= (x / (x / l));p[x]= (p[x] + 1ll * (r - l + 1) * (x / l) % mod) % mod;//整除分块前缀和 }
}
int main()
{scanf("%d", &T);get_mu();for (int i= 1; i <= 1e5; i++)getans(i);while (T--) {scanf("%d%d%d", &A, &B, &C);ans= cnt= 0;Max= max(max(A, B), C);for (int i= Max; i >= 1; i--) {//i枚举的是三数的人最大公约数for (int j= i; j <= Max; j+= i) {if (!mu[j])continue;for (int k= j; 1ll*k*j /i<= 1ll * Max; k+= i) {//k*j/i就是这个两个数的lcm,要小于等于Max if (!mu[k])continue;if (!mp[j][k]) {//                        printf("%d %d %d i=%d\n", j, k, j / i * k,i);++cnt;sA[cnt]= j;sB[cnt]= k;sC[cnt]= 1ll*j*k/ i  ;//sC是j和k的最小公倍数 deg[j]++;deg[k]++;mp[j][k]= 1;}}}}solve();for (int i= 1; i <= Max; i++) {ve[i].clear();mp[i].clear();deg[i]= 0;}printf("%d\n", (ans + mod) % mod);}return 0;
}

P4619 [SDOI2018]旧试题相关推荐

  1. P4619 [SDOI2018]旧试题(莫比乌斯反演,建图优化三重枚举,三元环计数,神仙好题,超级清晰易懂)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4619 [SDOI2018]旧试题(莫比乌斯反演,三元环计数) Problem 计算: ∑i=1A ...

  2. [SDOI2018] 旧试题

    推狮子的部分 \[ \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sigma(ijk) =\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sum_ ...

  3. [bzoj 5332][SDOI2018]旧试题

    传送门 Description \[ \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ijk) (\mathrm{mod\:} 10^9+7) \] 其中 \(d(ijk) ...

  4. [SDOI2018]旧试题 题解

    传送门 简单反演+神仙优化题. 首先我们知道 σ0(xy)=∑i∣x∑j∣y[(i,j)=1]\sigma_0(xy)=\sum\limits_{i|x}\sum\limits_{j|y}[(i,j) ...

  5. 牛客挑战赛51 E NIT的gcd(欧拉反演,建图优化,三元环计数)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给你一个正整数 nnn. 请你输出 ∑i=1n∑j=1n∑k=1ngcd⁡(i,j)g ...

  6. Algorithm Review 3 数论

    数论 若 a≡b(modm)a \equiv b (\mod m)a≡b(modm),则 (a,m)=(b,m)(a, m) = (b, m)(a,m)=(b,m). a≡b(modmi)(1≤i≤n ...

  7. 今天给大家分享几款试卷下载器和试卷生成器

    今天给大家分享几款试卷下载器和试卷生成器.随着互联网技术的不断发展,这些工具不仅可以帮助我们更加便捷地获取所需试卷和答案,还可以提高出题质量和效率.下面就让我们一起来看看这些实用的工具吧. 分享一:学 ...

  8. 图论,专为迷途少年而生

    文章目录 目录 图的存储 邻接矩阵 前向星 Topsort P1038 神经网络 P1983 车站分级 最小生成树 MST 堆优化Prim 并查集Kruskal Matrix Tree Theory ...

  9. 【博客搬家旧文】剑指offer [ java ] 面试题10 斐波那契数列

    契波那契数列最常见的解法,递归如下: public class Solution {public int Fibonacci(int n) {if(n == 0)return 0;else if(n ...

最新文章

  1. ubuntu体验python_在Ubuntu下配置舒服的Python开发环境
  2. vue 动态生成路由菜单(从后端请求到菜单数据,生成左侧菜单栏)
  3. P3391 【模板】文艺平衡树(Splay)
  4. spring boot+mybatis执行controller中拼接后的SQL
  5. 码农和程序员等的差别
  6. 【渝粤教育】电大中专会计电算化_1作业 题库
  7. 读书笔记—《销售铁军》随记9-最后一篇
  8. python汉诺塔运行程序_用python编写一个程序,得到汉诺塔的解决方案
  9. WORD如何定义新项目符号?
  10. android开发actionbar,Android 开发之为ActionBar 添加Actionbar Button
  11. 或许你不知道的10条SQL技巧
  12. 7.深入分布式缓存:从原理到实践 --- Redis探秘
  13. 消息队列(MSMQ)学习
  14. 六、瞰景Smart3D三维重建
  15. Screw 整合Oracle 报错异常信息oracle.jdbc.driver.T4CConnection.isValid(I)Z
  16. 步进电机控制系统设计
  17. RabbitMq消息中心_延迟发送消息
  18. 三星手机 qq上通过我的设备我的android上传到手机的东西,两个手机怎么互传文件?...
  19. 全国高校食堂排行榜TOP10?!
  20. 华盛顿与李大学教授出版的这本数据结构书,是国外高等院校优秀教材

热门文章

  1. 晚上我们一起去白码会所玩啊!
  2. 双十一,单身狗除了买买买,还能做什么?
  3. “甜橙金融杯”数据建模大赛发布,8万重金寻找大数据金融人才!
  4. 有人问我:AI这么火,要不要去追赶AI的热潮?
  5. 00截断上传绕过_小谈截断上传漏洞
  6. php中怎样表示组合框,php – 如何实现动态组合框选择系统
  7. composer 查看php 版本_最常用的PHP版本:PHP 7.3取代7.2
  8. c语言中二重指针如何赋值,关于二重指针释放的有关问题
  9. Spring框架相关问题
  10. leetcode844. 比较含退格的字符串