传送门

Description

\[\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ijk) (\mathrm{mod\:} 10^9+7)
\]

其中 \(d(ijk)\) 表示 \(i × j × k\)的约数个数。

Solution

首先,有一个公式

\[σ_0(n_1n_2···n_m) =\sum_{a_1|n_1}\sum_{a_2|n_2}···\sum_{a_m|n_m}\prod_{1≤i \neq j≤m} [a_i ⊥ a_j]
\]

所以,我们就可以把答案反演成:

\[\sum_{u=1}^{M}\sum_{v=1}^{M}\sum_{w=1}^{M}\mu(u)\mu(v)\mu(w)\left ( \sum_{lcm(u,v)|x}\frac{A}{x} \right )\left ( \sum_{lcm(v,w)|y}\frac{B}{y} \right )\left ( \sum_{lcm(u,w)|z}\frac{C}{z} \right )
\]

其中,\(M=max\{ A,B,C\}\)

我们发现,根据调和级数,可以求出后面的那些都可以通过\(O(n\log n)\)预处理出来

我们先直接计算\(u=v=w\)以及\(u,v,w\)中恰有两个数相等的情况

然后剩下的就是\(u,v,w\)互不相同的了,我们把\(lcm(u,v)\leq M\)的\(u,v\)连边,这样,其实就是求所有三元环的贡献啦。

关于求三元环呢,这里有个不常用的黑科技,参见这里,可以使得复杂度为\(O(m\sqrt m)\)

其实图的边数是比较少的,所以目测能过

据说用\(vector\)要比较快?

Code 

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define max(a,b) ((a)>(b)?(a):(b))
  4. #define min(a,b) ((a)<(b)?(a):(b))
  5. inline int read()
  6. {
  7. int x=0,f=1;char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  10. return x*f;
  11. }
  12. #define MN 200005
  13. #define mN 100005
  14. #define mod 1000000007
  15. int mu[mN],pr[mN/10],tot;bool mark[mN];
  16. int gcd(int x,int y){return y?gcd(y,x%y):x;}
  17. inline void init_mu()
  18. {
  19. mu[1]=1;register int i,j;
  20. for(i=2;i<mN;++i)
  21. {
  22. if(!mark[i]){pr[++tot]=i;mu[i]=-1;}
  23. for(j=1;j<=tot&&pr[j]*i<mN;++j)
  24. {
  25. mark[pr[j]*i]=true;
  26. if(i%pr[j]) mu[pr[j]*i]=-mu[i];
  27. else{mu[pr[j]*i]=0;break;}
  28. }
  29. }
  30. }
  31. int T,A,B,C,N,M;
  32. ll fa[MN],fb[MN],fc[MN],ans;
  33. struct edge{int to,lcm;};
  34. struct Edge{int f,t,lcm;}e[MN<<4];int en;
  35. std::vector<edge> G[mN];
  36. int d[mN],mrk[mN];
  37. inline void init()
  38. {
  39. register int i,j;N=max(A,max(B,C));M=min(A,min(B,C));
  40. memset(d,0,sizeof d);en=0;for(i=1;i<=N;++i)G[i].clear();ans=0;
  41. memset(fa,0,sizeof fa);memset(fb,0,sizeof fb);memset(fc,0,sizeof fc);
  42. for(i=1;i<=A;++i) for(j=i;j<=A;j+=i) fa[i]+=A/j;
  43. for(i=1;i<=B;++i) for(j=i;j<=B;j+=i) fb[i]+=B/j;
  44. for(i=1;i<=C;++i) for(j=i;j<=C;j+=i) fc[i]+=C/j;
  45. }
  46. #define C(x,y,z) (fa[x]*fb[y]*fc[z])
  47. #define cal(x,y,z) (C(x,y,z)+C(x,z,y)+C(y,x,z)+C(y,z,x)+C(z,x,y)+C(z,y,x))
  48. int main()
  49. {
  50. register int g,i,j,k,x,y,w;
  51. T=read();init_mu();
  52. while(T--)
  53. {
  54. A=read();B=read();C=read();init();
  55. for(i=1;i<=M;++i)if(mu[i])ans+=mu[i]*mu[i]*mu[i]*fa[i]*fb[i]*fc[i];
  56. for(g=1;g<=N;++g)for(i=1;i*g<=N;++i)if(mu[i*g])for(j=i+1;1ll*i*j*g<=N;++j)if(mu[j*g]&&gcd(i,j)==1)
  57. {
  58. x=i*g;y=j*g;++d[x];++d[y];e[++en]=(Edge){x,y,x*j};w=x*j;
  59. ans+=1ll*mu[x]*mu[x]*mu[y]*(fa[x]*fb[w]*fc[w]+fa[w]*fb[x]*fc[w]+fa[w]*fb[w]*fc[x]);
  60. ans+=1ll*mu[x]*mu[y]*mu[y]*(fa[y]*fb[w]*fc[w]+fa[w]*fb[y]*fc[w]+fa[w]*fb[w]*fc[y]);
  61. }
  62. for(i=1;i<=en;++i)
  63. if(d[e[i].f]>d[e[i].t]||(d[e[i].f]==d[e[i].t]&&e[i].f<e[i].t)) G[e[i].f].push_back((edge){e[i].t,e[i].lcm});
  64. else G[e[i].t].push_back((edge){e[i].f,e[i].lcm});
  65. for(i=1;i<=N;++i)
  66. {
  67. for(j=G[i].size()-1;~j;--j) mrk[G[i][j].to]=G[i][j].lcm;
  68. for(j=G[i].size()-1;~j;--j)
  69. {
  70. x=G[i][j].to;register int ix=G[i][j].lcm,iy;
  71. for(k=G[x].size()-1;~k;--k)if(iy=mrk[y=G[x][k].to])
  72. {
  73. register int xy=G[x][k].lcm;
  74. ans+=mu[i]*mu[x]*mu[y]*cal(ix,iy,xy);
  75. }
  76. }
  77. for(j=G[i].size()-1;~j;--j) mrk[G[i][j].to]=0;
  78. }
  79. printf("%lld\n",ans%mod);
  80. }
  81. }

Blog来自PaperCloud,未经允许,请勿转载,TKS!

[bzoj 5332][SDOI2018]旧试题的更多相关文章

  1. 【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)

    [BZOJ5332][SDOI2018]旧试题(数论,三元环计数) 题面 BZOJ 洛谷 题解 如果只有一个\(\sum\),那么我们可以枚举每个答案的出现次数. 首先约数个数这个东西很不爽,就搞一搞 ...

  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. P4619 [SDOI2018]旧试题

    题目 P4619 [SDOI2018]旧试题 Ps:山东的题目可真(du)好(liu),思维+码量的神仙题 推式 求\(\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ij ...

  4. BZOJ5332: [Sdoi2018]旧试题(莫比乌斯反演)

    时光匆匆,转眼间又是一年寒暑…… 这是小 Q 同学第二次参加省队选拔赛. 今年,小 Q 痛定思痛,不再冒险偷取试题,而是通过练习旧 试题提升个人实力.可是旧试题太多了,小 Q 没日没夜地做题,却看不到 ...

  5. Bzoj5332: [Sdoi2018]旧试题

    国际惯例的题面首先我们进行一些相对显然的数学变化.解释一下第二行的那个变形,如果一个数是ijk的因数,那么它一定能被分解成三部分分别是i,j,k的因数.我们钦定一个质数只能在三部分的一个中出现.如果一 ...

  6. sdoi2018旧试题 证明

  7. LOJ2565 SDOI2018 旧试题 莫比乌斯反演、三元环计数

    传送门 这道题的思路似乎可以给很多同时枚举三个量的反演题目提供一个很好的启发-- 首先有结论:\(d(ijk) = \sum\limits_{x|i}\sum\limits_{y|j}\sum\lim ...

  8. [BZOJ 3332]旧试题

    Description 圣诞节将至.一年一度的难题又摆在wyx面前——如何给妹纸送礼物. wyx的后宫有n人,这n人之间有着复杂的关系网,相互认识的人有m对.wyx想要量化后宫之间的亲密度,于是准备给 ...

  9. loj#2565. 「SDOI2018」旧试题(反演 三元环计数)

    题意 题目链接 Sol 神仙反演题.在洛谷上疯狂被卡常 Orz shadowice #include<bits/stdc++.h> #define Pair pair<int, in ...

随机推荐

  1. springMVC关于异常优先级的处理

    优先级 既然在SpringMVC中有两种处理异常的方式,那么就存在一个优先级的问题: 当发生异常的时候,SpringMVC会如下处理: (1)SpringMVC会先从配置文件找异常解析器Handler ...

  2. windows下mysql表名区分大小写

    windows下mysql默认是不区分大小写的,但是linux会区分大小写 如何让windows下mysql区分大小写呢? 修改 my.ini 里面的mysqld部分 #区分大小写 lower_cas ...

  3. mongodb入门基本语法

    show dbs 查看所有数据库列表 二. 创建数据库 使用数据库. 创建数据库 use student 如果真的想把这个数据库创建成功, 那么必须插入一个数据. 数据库中不能直接插入数据,只能往集合 ...

  4. Access-Control-Max-Age

    app.UseCors(builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() .AllowCreden ...

  5. centos安装rocketMQ

    1.下载安装包 http://rocketmq.apache.org/release_notes/ 这里选择 4.4.0 版本,点击进去 可以选择源码包或者二进制文件,这里选择二进制文件(ps:如果选 ...

  6. 调试location指令时,直接让location输出文本

    有时候我们调试location指令时希望location指令能够直接输出文本,这样能够方便我们进行调试.这时我们可以使用echo模块实现,但是大多数情况我们没有安装这个模块,那么我们还可以使用另一个方 ...

  7. Extjs 兼容IE8常见问题及解决方法

    1. 在IE8中整个页面都打不开,一般情况是: 页面组件中最后一个属性出现了逗号 没有多余的逗号,就很有可能是组件中没有设置renderTo:Ext.getBody(); 2. 页面按钮颜色失效 自定 ...

  8. rem em min-width: 30em 的意思

    30em=30rem=30x16px=480px @media only screen and (min-width:30 em){ }

  9. DBShop后台RCE之曲线救国

    本文最早发布在朋友的公众号 黑客信徒 中,文章是自己写的 不存在抄袭  特此申明 --------------------- 前言 DBShop是一款基于ZendFramework2框架的电子商务系统 ...

  10. 使用Idea初始化一个spring boot 项目

    配置环境 Idea配置jdk8.0 1.打开Idea,点击右上角file,找到Other Settings选项,点击下方的Default Project Structure,如下所示 2.点击下图中所 ...