最后一次参加亚洲区……

题意:给出n(3 ≤ n ≤ 105)个数字,每个数ai满足1 ≤ ai ≤ 105,求有多少对(a,b,c)满足[(a, b) = (b, c) = (a, c) = 1] or [(a, b) ≠ 1 and (a, c) ≠ 1 and (b, c) ≠ 1],都互素或都不互素。

思路:如果是两个数,互素比较好求,边遍历边分解质因子,利用容斥原理即可知道前面与自己互素的有多少。left_prime[i]表示左边与自己互素的,left_no_prime[i]表示左边与自己不互素的数量,同理right表示右边的情况。

总用情况减去不合法情况即可,总共情况C(n,3),非法情况有以下几种:

对于b而言,②④即left_prime[b] * right_no_prime[b],③⑥即left_no_prime[b]*right_prime[b];

对于a而言,③⑤ 与①④,即right_prime[a] * right_no_prime[a];

对于c而言,②⑤ 与 ①⑥,即left_prime[c] * left_no_prime[c];

即可以发现这六个图每个出现了两次,故遍历一遍求出来除以2即是非法情况的数量。

代码:

加了个小优化,将100 000个数字,在init时分解质因子,每个数字只分解一次,C++ 300+ms AC

 #include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std; const int MAXN = ;
long long prime[MAXN+];
int getPrime(){
memset(prime,,sizeof(prime));
for(int i=;i<=MAXN;i++){
if(!prime[i]) prime[++prime[]]=i;
for(int j=;j<=prime[]&&prime[j]<=MAXN/i;j++){
prime[prime[j]*i]=;
if(i%prime[j]==) break;
}
}
return prime[];
} int Stack[MAXN][], s_top[MAXN];
int arr[MAXN],num[MAXN];
int left_prime[MAXN],left_no_prime[MAXN];
int right_prime[MAXN],right_no_prime[MAXN]; void factor_full_Stack(){
for(int i = ;i <= ;i ++){
s_top[i] = ;
int x = i;
for(int j = ;x != ;j ++){
if(prime[j] * prime[j] > i){
Stack[i][s_top[i] ++] = x;
break;
}
if(x % prime[j] == ) Stack[i][s_top[i] ++] = prime[j];
while(x % prime[j] == ) x /= prime[j];
}
}
return ;
} void factor(int x){
int end = ( << s_top[x]);
for(int i = ;i < end;i ++){
int tmp = ;
for(int j = ;j < s_top[x];j ++){
if(i & ( << j)){
tmp *= Stack[x][j];
}
}
num[tmp] ++;
}
return ;
} int cal_coprime_num(int x){
int res = ;
int end = ( << s_top[x]);
for(int i = ;i < end;i ++){
int cnt = ,tmp = ;
for(int j = ;j < s_top[x];j ++){
if(i & ( << j)){
cnt ++;
tmp *= Stack[x][j];
}
}
if(cnt & ){
res += num[tmp];
}else{
res -= num[tmp];
}
}
return res;
} void init(){
getPrime();
factor_full_Stack();
}
int main(){
init();
int T,n;
scanf("%d",&T);
while(T --){
scanf("%d",&n);
for(int i = ;i < n;i ++){
scanf("%d",&arr[i]);
} memset(num, , sizeof(num));
for(int i = ;i < n;i ++){
left_no_prime[i] = cal_coprime_num(arr[i]);
left_prime[i] = i - left_no_prime[i];
factor(arr[i]);
} memset(num, , sizeof(num));
for(int i = n - ;i >= ;i --){
right_no_prime[i] = cal_coprime_num(arr[i]);
right_prime[i] = n - i - - right_no_prime[i];
factor(arr[i]);
} long long res = (long long)n * (n-) *(long long)(n-) / ;
long long cha = ;
for(int i = ;i < n;i ++){
cha += (long long) left_prime[i] * left_no_prime[i];
cha += (long long) left_prime[i] * right_no_prime[i];
cha += (long long) right_prime[i] * left_no_prime[i];
cha += (long long) right_prime[i] * right_no_prime[i];
}
res -= cha / ;
printf("%I64d\n",res);
}
return ;
}

hdu5072 2014 Asia AnShan Regional Contest C Coprime的更多相关文章

  1. hdu5071 2014 Asia AnShan Regional Contest B Chat

    模拟题: add的时候出现过的则不再添加 close的时候会影响到top rotate(Prior.Choose)的时候会影响到top /*============================== ...

  2. 2014 Asia AnShan Regional Contest --- HDU 5073 Galaxy

    Galaxy Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5073 Mean: 在一条数轴上,有n颗卫星,现在你可以改变k颗 ...

  3. dp --- 2014 Asia AnShan Regional Contest --- HDU 5074 Hatsune Miku

    Hatsune Miku Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5074 Mean: 有m种音符(note),现在要从 ...

  4. 2014 Asia AnShan Regional Contest --- HDU 5078 Osu!

    Osu! Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5078 Mean: 略. analyse: 签到题,直接扫一遍就得答 ...

  5. HDU 5073 Galaxy 2014 Asia AnShan Regional Contest 规律题

    推公式 #include <cstdio> #include <cmath> #include <iomanip> #include <iostream> ...

  6. HDU 5074 Hatsune Miku 2014 Asia AnShan Regional Contest dp(水

    简单dp #include <stdio.h> #include <cstring> #include <iostream> #include <map> ...

  7. 2014 ACM-ICPC Asia Anshan Regional Contest(Online Version)

    题目I - Osu! - HDU 5078 题目分析:最水的一道题吧,求两点间的距离和时间差值的最大比值 #include<stdio.h> #include<math.h> ...

  8. UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  9. UVALive 7143 Room Assignment(组合数学+DP)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

随机推荐

  1. Linux 下部署单机 hadoop 测试

    最终运行结果展示: 格式化namenode. 开始测试 显示测试进程 浏览器查看效果展示:(虽然还不清楚是什么意思,但是能看到这个效果已经很开心了) 话不多说,进入主题: 1. 安装 VMwareSt ...

  2. NGUI-制作位图字体以及图文混排

    制作字体过程 首先得下载一个位图制作工具Bitmap font generator,可以点击这里下载 1.新建txt文件,输入字体里面包含的文字 2.保存为utf-8格式:点击文件另存为,选择编码格式 ...

  3. ansible安装及问题解决

    本文主要用来安装ansible,在进行安装的时候,也可以使用其他的版本进行安装,本文主要讲述安装ansible的步骤,还有常用问题的解决. 1.查看python版本 由此可以看到python的版本为2 ...

  4. 跨站脚本攻击(Cross‐Site Scripting (XSS))实践

    作者发现博客园在首页显示摘要时未做html标签的过滤,致使摘要中的html代码可以被执行,从而可以注入任何想要被执行的js代码,作者利用这一缺陷在本文摘要中插入了一段js代码执行alert弹窗,同时增 ...

  5. wpf4 文字 模糊 不清晰 解决方法

    在窗口或控件上设置字体属性就可以了,如下:<UserControl x:Class="..."             xmlns="http://schemas. ...

  6. Hadoop学习记录(1)|伪分布安装

    本文转载自向着梦想奋斗博客 Hadoop是什么? 适合大数据的分布式存储于计算平台 不适用小规模数据 作者:Doug Cutting 受Google三篇论文的启发 Hadoop核心项目 HDFS(Ha ...

  7. git(osx)上的一个git commit无法正确提交的问题

    我发现在我修改我自己的文件之后企图使用git commit编辑更加详细的争对这次提交的信息的时候 我mac上的vi编辑器貌似 出现了问题 大概报这个错. error: There was a prob ...

  8. Hadoop应用开发实战案例 第2周

    比如,封面,是一网页,可以看出用户在此网页上,鼠标呈现F形状. 海量Web日志分析 用Hadoop提取KPI统计指标 更详细原文博客:http://blog.fens.me/hadoop-mapred ...

  9. HDU 5437 Alisha’s Party (优先队列模拟)

    题意:邀请k个朋友,每个朋友带有礼物价值不一,m次开门,每次开门让一定人数p(如果门外人数少于p,全都进去)进来,当最后所有人都到了还会再开一次门,让还没进来的人进来,每次都是礼物价值高的人先进.最后 ...

  10. 编译ffmpeg(iOS)

    一,x264库的编译 首先到http://www.videolan.org/developers/x264.html下载x264的库,然后解压,修改文件夹名称为x264     二,下载ffmpeg2 ...