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 ...
随机推荐
- 生产环境服务CPU高问题分析
问题描述: 现网个别时候会出现CPU突然飙高的现象,飙高后不能恢复正常. 分析过程: CPU飙高后抓dump,最好本机看,其它机器看dump可能需要下载服务运行机器的sos,clr 0:000 ...
- [转]SqlPlus安装配置
本文转载自http://blog.csdn.net/wuxiaoyan_home/article/details/4826440 一.下载oracle 10g sqlplus软件 http://www ...
- 网络编程 --- URLConnection --- 读取服务器的数据 --- java
使用URLConnection类获取服务器的数据 抽象类URLConnection表示一个指向指定URL资源的活动连接,它是java协议处理器机制的一部分. URL对象的openConnection( ...
- 高质量代码之HTML、CSS篇
HTML篇 使用语义化标签<strong><fieldset><legend><ul>等等,少用<div><span> 判断网页 ...
- .NET中的Newtonsoft.Json.JsonConvert.SerializeObject(string a)
1.將string a 序列化為Json格式: 2.使用條件:將Newtonsoft.Json.dll作為引用添加到項目中.下载地址在这:http://json.codeplex.com/
- 转 AI教程 logo
版权申明:本文原创作者飞屋工作室,感谢飞屋工作室的原创分享! 这篇AI制作标志教程是一个非常实用的教程.通过这个教程飞特的朋友们将会学习到AI制作标志的流程和标志的创作思路.非常实用.推荐过来和飞特的 ...
- mysql 的 GROUP_CONCAT
GROUP_CONCAT 通常跟 group by 一起用,但也可以不用.例:select GROUP_CONCAT(pct_id) as pct_ids from (select max(pct_i ...
- 【转】MySQL日期时间函数大全
MySQL日期时间函数大全 1.DAYOFWEEK(date) 返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK( ...
- Skeletal Animation
[Skeletal Animation] Skeletal animation is the use of “bones” to animate a model. The movement of bo ...
- Advanced Scene Processing
[How a Scene Processes Frames of Animation] In the traditional view system, the contents of a view a ...