设$f(x)=\sum_{x|d}p(d)$。

则$ans=\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\mu(i)\mu(j)\mu(k)f(lcm(i,j))f(lcm(i,k))f(lcm(j,k))$。

转化成图论模型,$i$到$j$有边的条件是$\mu(i)\neq0,\mu(j)\neq0,lcm(i,j)\leq n$。

枚举square-free的$\gcd$,再枚举square-free的$lcm$,然后枚举$\frac{lcm}{\gcd}$的因子$a$,那么可以得到一对满足条件的数对$(a\times\gcd,\frac{lcm}{a})$。

这样可以不重不漏地枚举出所有边,然后三元环计数即可。

时间复杂度$O(n\log n\sqrt{n\log n})$。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100005,M=1166760,E=760745;
int n,i,j,k,x,y,z,P[N],f[N],vis[N],mu[N],p[N],tot,ans,A,B;
int g[N],v[M],nxt[M],ed,d[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
namespace Triple{
int g[N],v[E],w[E],nxt[E],ed,st[N],en[N],m,q[M],val[M],tmp[N];
inline void add(int x,int y,int z){
if(d[x]>d[y])swap(x,y);
v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;
}
void solve(){
for(i=1;i<=n;i++)if(g[i]){
st[i]=m+1;
for(j=g[i];j;j=nxt[j])tmp[q[++m]=v[j]]=w[j];
en[i]=m;
sort(q+st[i],q+m+1);
for(j=st[i];j<=m;j++)val[j]=tmp[q[j]];
}
for(i=1;i<=n;i++)for(j=g[i];j;j=nxt[j]){
k=v[j],x=st[i],y=st[k];
while(x<=en[i]&&y<=en[k])if(q[x]==q[y]){
z=q[x];
A+=mu[i]*mu[k]*mu[z]*w[j]*val[x]*val[y];
x++,y++;
}else q[x]<q[y]?x++:y++;
}
}
}
int main(){
read(n);
for(i=1;i<=n;i++)read(P[i]);
for(i=1;i<=n;i++)for(j=i;j<=n;j+=i)f[i]+=P[j],add(j,i);
for(mu[1]=1,i=2;i<=n;i++){
if(!vis[i])p[tot++]=i,mu[i]=-1;
for(j=0;i*p[j]<=n&&j<tot;j++){
vis[i*p[j]]=1;
if(i%p[j])mu[i*p[j]]=-mu[i];else break;
}
}
for(i=1;i<=n;i++)ans+=mu[i]*f[i]*f[i]*f[i];
for(i=1;i<=n;i++)if(mu[i])for(j=i;j<=n;j+=i)if(mu[j]&&mu[j/i])for(k=g[j/i];k;k=nxt[k]){
x=i*v[k],y=j/v[k];
if(x>=y)continue;
d[x]++,d[y]++;
B+=(mu[x]*f[y]+mu[y]*f[x])*f[j]*f[j];
}
for(i=1;i<=n;i++)if(mu[i])for(j=i;j<=n;j+=i)if(mu[j]&&mu[j/i])for(k=g[j/i];k;k=nxt[k]){
x=i*v[k],y=j/v[k];
if(x>=y)continue;
Triple::add(x,y,f[j]);
}
Triple::solve();
return printf("%d",(ans+A*6+B*3)&((1<<30)-1)),0;
}

  

BZOJ4546(原) : 三元组的更多相关文章

  1. Neo4j基本使用及导入三元组

    下载和安装Neo4j 安装Java JDK 下载Neo4j安装文件 创建系统环境变量 Neo4j配置 配置文档存储在conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作.默认情况 ...

  2. 稀疏矩阵三元组表快速转置(C语言实现)

    本来准备昨天下午写的,但是因为去参加360众测靶场的考核耽搁了,靶场的题目还是挺基础的. 继续学习吧. 使用黑色墨水在白纸上签名就像由像素点构成的稀疏矩阵.如图4所示. 图4 手写体签名 [问题]请将 ...

  3. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限

    上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...

  4. NLP(二十七)开放领域的三元组抽取的一次尝试

      当我写下这篇文章的时候,我的内心是激动的,这是因为,自从去年6月份写了文章利用关系抽取构建知识图谱的一次尝试 后,我就一直在试图寻找一种在开放领域能够进行三元组抽取的办法,也有很多读者问过我这方面 ...

  5. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  6. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  8. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  9. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

随机推荐

  1. 查询Oracle中字段名带"."的数据

    SDE中的TT_L线层会有SHAPE.LEN这样的字段,使用: SQL>select shape.len from tt_l; 或 SQL>select t.shape.len from ...

  2. Hadoop CDH5 集群管理

    Hadoop 是一个开源项目,所以很多公司在这个基础进行商业化,Cloudera 对 Hadoop做了相应的改变.Cloudera 公司的发行版,我们将该版本称为 CDH(Cloudera Distr ...

  3. php 时间倒计时

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. CLR via C#(17)--接口

    CLR不允许继承多个基类,但是可以继承多个接口.凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例. 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全 ...

  5. 理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  6. 谈谈Delphi中的类和对象3---抽象类和它的实例

    四.抽象类和它的实例 Delphi中有一个类称为是抽象类,你不能天真的直接为它创建一个实例,如 var StrLst: TString; begin StrLst:= TString.Create; ...

  7. CI框架获取post和get参数 CodeIgniter

    请参考:CI文档的输入类部分: $this->input->post() $this->input->get() ------------------------------- ...

  8. Bootstrap看厌了?试试Metro UI CSS吧

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:Bootstrap作为一款超级流行的前端框架,已经成为很多人的首选,不过有时未免有点审 ...

  9. 等号赋值与memcpy的效率问题

    转自:http://www.aiuxian.com/article/p-1309055.html 偶尔看到一个说法,说,小内存的拷贝,使用等号直接赋值比memcpy快得多.结合自己搜集到的资料,整理成 ...

  10. base64编码、解码的C语言实现

    转自:http://www.cnblogs.com/yejianfei/archive/2013/04/06/3002838.html base64是一种基于64个可打印字符来表示二进制数据的表示方法 ...