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

题面

BZOJ

洛谷

题解

如果只有一个\(\sum\),那么我们可以枚举每个答案的出现次数。

首先约数个数这个东西很不爽,就搞一搞,变成\(\displaystyle \sum_{d|i}1\)

那么原式就可以写成:\(\displaystyle \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sum_{d=1}^Ad|ijk\)。

既然\(d|ijk\),意味着\(d\)可以分别拆成\(i\)的一个因子,\(j\)的一个因子,\(k\)的一个因子的乘积,那么我们接着写,改写成\(\displaystyle \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sum_{x|i}\sum_{y|j}\sum_{z|k}1\)的形式。然而这个样子是会算重的。考虑这里怎么处理。

\(\displaystyle d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\)。

证明:

令\(i*j=\prod p_i^{a_i}\),令\(i=\prod p_i^{b_i}\),则\(j=\prod p_i^{a_i-b_i}\)。

令\(x=\prod p_i^{c_i},y=\prod p_i^{d_i}\),如果\(gcd(x,y)=1\),那么必定有\(c_i\)和\(d_i\)中有一个取值为\(0\),那么这个质因子的可以分配的方案数就是\((b_i+1)+(a_i-b_i+1)-1=a_i+1\)。

发现这个式子与唯一分解定理求解约数个数的式子一样,所以得证。

类似的可以证明\(\displaystyle d(ijk)=\sum_{x|i}\sum_{y|j}\sum_{z|k}[(x,y)=1][(y,z)=1][(z,x)=1]\)。

这样子我们就可以把式子写成:$$\displaystyle \sum_{i=1}A\sum_{j=1}B\sum_{k=1}^C\sum_{x|i}\sum_{y|j}\sum_{z|k}[(x,y)=1][(y,z)=1][(z,x)=1]$$

然后改变枚举顺序:$$\displaystyle \sum_{x=1}A\sum_{y=1}B\sum_{z=1}^C[(x,y)=1][(y,z)=1][(z,x)=1][\frac{A}{x}][\frac{B}{y}][\frac{C}{z}]$$

然后把\([(x,y)=1]\)变成\(\displaystyle \sum_{d|x,d|y}\mu(d)\)。

然后式子就变成了:

\[\displaystyle \sum_{x=1}^A\sum_{y=1}^B\sum_{z=1}^C\sum_{d1|x,d1|y}\mu(d1)\sum_{d2|y,d2|z}\mu(d2)\sum_{d3|z,d3|x}\mu(d3)[\frac{A}{x}][\frac{B}{y}][\frac{C}{z}]
\]

然后转而枚举\(d1,d2,d3\):

\[\displaystyle \sum_{d1=1}^A\sum_{d2=1}^B\sum_{d3=1}^C\mu(d1)\mu(d2)\mu(d3)\sum_{lcm(d1,d3)|x}[\frac{A}{x}]\sum_{lcm(d1,d2)|y}[\frac{B}{y}]\sum_{lcm(d2,d3)|z}[\frac{C}{z}]
\]

后面的东西,显然可以在调和级数的复杂度内预处理,并且当\(lcm>max(A,B,C)\)的时候的值就是\(0\)。

那么考虑枚举两个数,如果它们两个的\(lcm\le max\)的话就在他们之间连上一条边,这样子就得到了一张无向图,把自环处理掉,那么剩下的每一个三元环把他们对应到\(d1,d2,d3\)上面就是一组解。把自环丢掉的时候也丢掉了有两个数或者三个数相等的情况,所以还需要额外算一下。

然而直接枚举任意两个点是\(O(n^2)\)的。

我们考虑枚举两者的\(gcd\),然后再来枚举两个互质的数,以为\(\mu=0\)也是没有贡献的,所以\(\mu=0\)的数也不用考虑,这样子就可以减掉大量没有用的状态。

然后跑个三元环就好了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. #define ll long long
  7. #define pb push_back
  8. #define MAX 100100
  9. #define MOD 1000000007
  10. inline int read()
  11. {
  12. int x=0;bool t=false;char ch=getchar();
  13. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  14. if(ch=='-')t=true,ch=getchar();
  15. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  16. return t?-x:x;
  17. }
  18. int pri[MAX],tot,mu[MAX];bool zs[MAX];
  19. void Sieve()
  20. {
  21. mu[1]=1;
  22. for(int i=2;i<MAX;++i)
  23. {
  24. if(!zs[i])pri[++tot]=i,mu[i]=-1;
  25. for(int j=1;j<=tot&&i*pri[j]<MAX;++j)
  26. {
  27. zs[i*pri[j]]=true;
  28. if(i%pri[j]==0)break;
  29. mu[i*pri[j]]=-mu[i];
  30. }
  31. }
  32. }
  33. int A,B,C,mx,dg[MAX],vis[MAX],book[MAX];
  34. ll ans,fa[MAX],fb[MAX],fc[MAX];
  35. vector<int> U,V,W;
  36. vector<int> e[MAX],w[MAX];
  37. int main()
  38. {
  39. Sieve();int T=read();
  40. while(T--)
  41. {
  42. A=read();B=read();C=read();mx=max(A,max(B,C));ans=0;
  43. for(int i=1;i<=A;++i)for(int j=i;j<=A;j+=i)fa[i]+=A/j;
  44. for(int i=1;i<=B;++i)for(int j=i;j<=B;j+=i)fb[i]+=B/j;
  45. for(int i=1;i<=C;++i)for(int j=i;j<=C;j+=i)fc[i]+=C/j;
  46. for(int i=1;i<=A&&i<=B&&i<=C;++i)if(mu[i])ans+=mu[i]*fa[i]*fb[i]*fc[i];
  47. for(int i=1;i<=mx;++i)
  48. {
  49. if(!mu[i])continue;
  50. for(int j=1;i*j<=mx;++j)
  51. {
  52. if(!mu[i*j])continue;
  53. for(int k=j+1;1ll*i*j*k<=mx;++k)
  54. {
  55. if(!mu[i*k])continue;
  56. if(__gcd(j,k)>1)continue;
  57. int x=i*j,y=i*k,l=i*j*k;
  58. ans+=mu[y]*(fa[x]*fb[l]*fc[l]+fa[l]*fb[x]*fc[l]+fa[l]*fb[l]*fc[x]);
  59. ans+=mu[x]*(fa[y]*fb[l]*fc[l]+fa[l]*fb[y]*fc[l]+fa[l]*fb[l]*fc[y]);
  60. ++dg[x];++dg[y];U.pb(x);V.pb(y);W.pb(l);
  61. }
  62. }
  63. }
  64. for(int i=0,l=U.size();i<l;++i)
  65. {
  66. int u=U[i],v=V[i];
  67. if(dg[u]<dg[v]||(dg[u]==dg[v]&&u<v))e[v].pb(u),w[v].pb(W[i]);
  68. else e[u].pb(v),w[u].pb(W[i]);
  69. }
  70. for(int i=1;i<=mx;++i)
  71. {
  72. for(int j=0,l=e[i].size();j<l;++j)vis[e[i][j]]=i,book[e[i][j]]=w[i][j];
  73. for(int j=0,l=e[i].size();j<l;++j)
  74. {
  75. int u=e[i][j];
  76. for(int k=0,lk=e[u].size();k<lk;++k)
  77. {
  78. int v=e[u][k];if(vis[v]!=i)continue;
  79. int a=w[i][j],b=book[v],c=w[u][k];
  80. ans+=mu[i]*mu[u]*mu[v]*(fa[a]*fb[b]*fc[c]+fa[a]*fb[c]*fc[b]+fa[b]*fb[a]*fc[c]+fa[b]*fb[c]*fc[a]+fa[c]*fb[a]*fc[b]+fa[c]*fb[b]*fc[a]);
  81. }
  82. }
  83. }
  84. printf("%lld\n",ans%MOD);
  85. for(int i=1;i<=mx;++i)fa[i]=fb[i]=fc[i]=dg[i]=vis[i]=0;
  86. for(int i=1;i<=mx;++i)e[i].clear(),w[i].clear();
  87. U.clear();V.clear();W.clear();
  88. }
  89. }

【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)的更多相关文章

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

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

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

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

  3. Bzoj5332: [Sdoi2018]旧试题

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

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

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

  5. [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_ ...

  6. P4619 [SDOI2018]旧试题

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

  7. Codechef SUMCUBE Sum of Cubes 组合、三元环计数

    传送门 好久没有做过图论题了-- 考虑\(k\)次方的组合意义,实际上,要求的所有方案中导出子图边数的\(k\)次方,等价于有顺序地选出其中\(k\)条边,计算它们在哪一些图中出现过,将所有方案计算出 ...

  8. loj#6076「2017 山东一轮集训 Day6」三元组 莫比乌斯反演 + 三元环计数

    题目大意: 给定\(a, b, c\),求\(\sum \limits_{i = 1}^a \sum \limits_{j = 1}^b \sum \limits_{k = 1}^c [(i, j) ...

  9. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

随机推荐

  1. hibernate 关于hbm.xml编写的总结

    在Hibernate中,各表的映射文件….hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具.本节简单的讲述一下这些配置文件的配置. 配置文件的基本结构 ...

  2. html总结:float实现span和input输入框同行

    例: <input type="text" name="ytdwname" value="<%=user.getYtdwname() %& ...

  3. jmeter高并发设计方案(转)

    高并发设计方案二(秒杀架构) 优化方向: (1)将请求尽量拦截在系统上游(不要让锁冲突落到数据库上去).传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,并发高响应慢,几乎所有请求都超 ...

  4. python文件封装成*.exe文件(单文件和多文件)

    环境:win10 64位  python3.7 单*.py文件打包Python GUI:程序打包为exe 一.安装Pyinstaller,命令pip install Pyinstaller,(大写的P ...

  5. IdentityServer4【Introduction】之包和项目构建

    包和项目构建 IdentityServer包含了以下的nuget包: IdentityServer4 nuget | github 这个包包含了IdentityServer核心的组成部分,有对象模型, ...

  6. CMake--List用法

    list(LENGTH <list><output variable>) list(GET <list> <elementindex> [<ele ...

  7. mysql 中出现:不能打开到主机的连接,在端口3306: 连接失败

    由于某种原因,在服务器部署,然后mysql就连接不上了, navicat查看数据库正常,telnet怎么都不同,总会卡一会儿说遗失主机,最后终于找到解决办法 http://www.51testing. ...

  8. com.alibaba的fastjson简介

    fastjson简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSO ...

  9. Mybatis之执行自定义SQL举例

    本文说明如何使用Mybatis执行我自定义输入的SQL语句. 需要的mybaits文件包括:配置文件(mybatis-config-dao.xml 和 jdbc.properties).接口文件(IS ...

  10. 【SSL】OV、DV和EV证书的区别

    关于https证书 https协议需要到ca申请证书,一般免费证书很少,需要交费. http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议. http和https使用 ...