hdu5072 2014 Asia AnShan Regional Contest C Coprime
最后一次参加亚洲区……
题意:给出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的更多相关文章
- hdu5071 2014 Asia AnShan Regional Contest B Chat
模拟题: add的时候出现过的则不再添加 close的时候会影响到top rotate(Prior.Choose)的时候会影响到top /*============================== ...
- 2014 Asia AnShan Regional Contest --- HDU 5073 Galaxy
Galaxy Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5073 Mean: 在一条数轴上,有n颗卫星,现在你可以改变k颗 ...
- 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),现在要从 ...
- 2014 Asia AnShan Regional Contest --- HDU 5078 Osu!
Osu! Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5078 Mean: 略. analyse: 签到题,直接扫一遍就得答 ...
- HDU 5073 Galaxy 2014 Asia AnShan Regional Contest 规律题
推公式 #include <cstdio> #include <cmath> #include <iomanip> #include <iostream> ...
- HDU 5074 Hatsune Miku 2014 Asia AnShan Regional Contest dp(水
简单dp #include <stdio.h> #include <cstring> #include <iostream> #include <map> ...
- 2014 ACM-ICPC Asia Anshan Regional Contest(Online Version)
题目I - Osu! - HDU 5078 题目分析:最水的一道题吧,求两点间的距离和时间差值的最大比值 #include<stdio.h> #include<math.h> ...
- 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 ...
- UVALive 7143 Room Assignment(组合数学+DP)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
随机推荐
- VS 2013 EFSQLITE
在 vs 2013 上用 1.NuGet程序包来获取,它也会自动下载EF6的包 :system.Data.sqlite 他会自动下载 其它几个需要的包. 2.在Sqlite官网上下载对应的版本:htt ...
- 约瑟夫环 --- 面向对象 --- java代码
约瑟夫环 的 面向对象 解法 罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个 ...
- ansible安装及问题解决
本文主要用来安装ansible,在进行安装的时候,也可以使用其他的版本进行安装,本文主要讲述安装ansible的步骤,还有常用问题的解决. 1.查看python版本 由此可以看到python的版本为2 ...
- [python]Python操作MySQL
[安装] 安装MySQL 安装MySQL不用多说了,下载下来安装就是,没有特别需要注意的地方. 一个下载地址:点击打开链接 [样例] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- Flex之DataGrid和Tree控件的数据源XML格式
1.flex的完整代码: <?xml version="1.0" encoding="utf-8"?> <s:Application xmln ...
- Time vs Story Points Estimation [转]
One of the most common questions we get is whether to estimate in time or points. It seems like poin ...
- Spring Boot 所提供的配置优先级顺序
按照优先级从高到低的顺序,具体的列表如下所示. 命令行参数. 通过 System.getProperties() 获取的 Java 系统参数. 操作系统环境变量. 从 java:comp/env 得到 ...
- CreateWaitableTimer和SetWaitableTimer函数(定时器)
用户感觉到软件的好用,就是可以定时地做一些工作,而不需要人参与进去.比如每天定时地升级病毒库,定时地下载电影,定时地更新游戏里的人物.要想 实现这些功能,就可以使用定时器的API函数CreateWai ...
- HNC-全局联想脉络
全局联想脉络—语义块 和句类 一个语义块包含 核心部分 和说明部分. 语义块分为: 主语义块:有 4 种:特征E.作用者A.对象B.内容C 辅语义块:有 7 种:条件.手段.工具.途径.参照.因.果. ...
- 乱侃c++
就在刚才我感觉c++真的好复杂,函数重载,多态,虚函数,虚函数表,模版,继承等一大坨东西好恶心,c++既然完全支持C语言,当然是把它的优缺点统统接下了,C语言中指针本身并不太难,是C语言的精华,当年刚 ...