Pagini recente » Cod sursa (job #1142244) | Profil M@2Te4i | Istoria paginii utilizator/jcg9129 | Cod sursa (job #316464) | Cod sursa (job #885871)
Cod sursa(job #885871)
#include <fstream>
#include <vector>
#include <algorithm>
#define FOR(i,a,b) for(int i = a;i <= b;i++)
#define i64 long long
using namespace std;
ifstream cin("test.in");
ofstream cout("test.out");
const int NMAX = int(1e6)+ 2;
int N;
vector<int> v;
char p[1024];
int primes[512], cardP;
int c[NMAX];
void sieve() {
for(int i = 2;i < 1024;i++) {
if(p[i] == 0) {
primes[cardP++] = i;
for(int j = i + i;j < 1024;j += i) {
p[j] = 1;
}
}
}
}
int gcd(int a,int b) { return !b ? a : gcd(b,a%b);}
void readData() {
cin>>N;
v.resize(N);
FOR(i,0,N - 1) {
cin>>v[i];
}
}
i64 brute() {
i64 ret = 0;
sort(v.begin(),v.end());
FOR(i,0,N - 1) {
FOR(j,0,i - 1) {
if(gcd(v[i],v[j]) == 1) {
ret++;
// cout<<v[j]<<" "<<v[i]<<"\n";
}
}
}
return ret;
}
i64 solve() {
i64 ret = 0;
sieve();
sort(v.begin(),v.end());
int f[32], num;
FOR(i,0,N - 1) {
num = 0;
int val = v[i];
for(int k = 0;primes[k]*primes[k] <= val;k++) {
if(val%primes[k] == 0) {
f[num++] = primes[k];
do {
val /= primes[k];
} while(val%primes[k] == 0);
}
}
if(val > 1) {
f[num++] = val;
}
int notCoprime = 0;
// cout<<v[i]<<" : ";
for(int j = 1;j < (1<<num);j++) {
int currValue = 1, bitCnt = 0;
for(int k = 0;k < num;k++) {
if((j>>k) & 1) {
bitCnt++;
currValue = currValue*f[k];
}
}
notCoprime += ((bitCnt & 1) ? 1 : -1) * c[currValue];
c[currValue]++;
// cout<<currValue<<" ";
}
// cout<<"\n";cout<<notCoprime<<"\n";
ret += i - notCoprime;
}
return ret;
}
int main()
{
readData();
cout<<solve()<<"\n";
return 0;
}