BZOJ4546(原) : 三元组
设$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(原) : 三元组的更多相关文章
- Neo4j基本使用及导入三元组
下载和安装Neo4j 安装Java JDK 下载Neo4j安装文件 创建系统环境变量 Neo4j配置 配置文档存储在conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作.默认情况 ...
- 稀疏矩阵三元组表快速转置(C语言实现)
本来准备昨天下午写的,但是因为去参加360众测靶场的考核耽搁了,靶场的题目还是挺基础的. 继续学习吧. 使用黑色墨水在白纸上签名就像由像素点构成的稀疏矩阵.如图4所示. 图4 手写体签名 [问题]请将 ...
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限
上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...
- NLP(二十七)开放领域的三元组抽取的一次尝试
当我写下这篇文章的时候,我的内心是激动的,这是因为,自从去年6月份写了文章利用关系抽取构建知识图谱的一次尝试 后,我就一直在试图寻找一种在开放领域能够进行三元组抽取的办法,也有很多读者问过我这方面 ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
随机推荐
- 将前台json对象传入java后台
前台json格式的数据如何传入后台 1. 将要传入后台的数据组装成JSON格式的字符串: var jsonStr = [{'name':'jim' , 'age':20} , {'name':'kin ...
- iOS,Objective-C,相册功能的实现。
#import "ViewController.h" #define kuan [UIScreen mainScreen].bounds.size.width #define ga ...
- python中random模块使用
- python 连接sql server
linux 下pymssql模块的安装 所需压缩包:pymssql-2.1.0.tar.bz2freetds-patched.tar.gz 安装: tar -xvf pymssql-2.1.0.tar ...
- kvm 下运行的 WINWS7磁盘空间不足 增加磁盘 实战(这个有问题,还未解决)
创建一个新硬盘: [root@NB vhost]# qemu-img create -f qcow2 add_win_desk.img 5G Formatting encryption=off clu ...
- 对Cookie和Session的深入理解
session对象 session对象用于存储特定的用户会话所需的信息 . Session对象的引入是为了弥补HTTP协议的不足.HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端 ...
- AXURE在原型设计中的应用
转: http://uedc.163.com/2248.html 前言 什么是原型呢? 产品原型简单的说就是产品设计成形之前的一个简单框架,对网站来讲,就是将页面模块.元素进行粗放式的排版和布局,深入 ...
- Oracle 【IT实验室】数据库备份与恢复之一:exp/imp(导出与导入&装库与卸库)
1.1 基本命令 1. 获取帮助 $ exp help=y $ imp help=y 2. 三种工作方式 (1)交互式方式 $ exp // 然后按提示输入所需要的参数 ...
- windows phone SDK 8.0 模拟器异常 0x89721800解决办法
删除 APPDATA\LOCAL\Microsoft\Phone Tools\CoreCon\10.0 从新启动即可!
- apk 打包方式
1 项目-->Android tools -->Export Signed Application Package 2 在项目 manifest.xml文件下 单击“use the Ex ...