最后一次参加亚洲区……

题意:给出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. bzoj 3270 博物馆(高斯消元)

    [题意] 两人起始在s,t点,一人pi概率选择留在i点或等概率移动,问两人在每个房间相遇的概率. [思路] 把两个合并为一个状态,(a,b)表示两人所处的状态,设f[i]为两人处于i状态的概率.则有转 ...

  2. 原型模式--prototype

    C++设计模式——原型模式 什么是原型模式? 在GOF的<设计模式:可复用面向对象软件的基础>中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.这这个定义中,最 ...

  3. URAL-1981 Parallel and Perpendicular 水题

    题目链接:http://www.cnblogs.com/zhsl/p/3395868.html 水题,注意细节. //STATUS:C++_AC_31MS_333KB #include <fun ...

  4. js运动 淡入淡出

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. static_cast, dynamic_cast, const_cast探讨

    转自:http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 ...

  6. 游戏模块分析总结(2)之UI、操作篇

    转自:http://www.gameres.com/309812.html 游戏模块分析总结(2)之UI.操作篇 发布者: wuye | 发布时间: 2014-12-12 15:03| 评论数: 0 ...

  7. 触控发布《Cocos开发者平台白皮书》

    Cocos 2014 开发者大会(秋季)组委会今天正式发布了<Cocos开发者平台白皮书>,GameRes游资网得到Cocos官方授权发布该白皮书电子版. 白皮书主要内容包括对行业的趋势解 ...

  8. WPF 判断是否为设计(Design)状态

    在WinForm开发中,一般会在窗体或者UserControl中判断当前是否为设计状态,如: if (!this.DesignMode) {     // } 有时候需要在Load事件中加上一些从服务 ...

  9. SpriteKitCommonUse

    [SpriteKitCommonUse] 1.SKView中提供了显示FPS和NodeCount(当前view)的方法,如下: 展现一个scene: - (void)viewWillAppear:(B ...

  10. hdu 4815 Little Tiger vs. Deep Monkey(01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=4815 Description A crowd of little animals is visiting a m ...