Cod sursa(job #995292)

Utilizator teoionescuIonescu Teodor teoionescu Data 8 septembrie 2013 15:58:23
Problema Pairs Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<fstream>
using namespace std;
ifstream in("pairs.in");
ofstream out("pairs.out");
const int M = 1000005;
int n,stor[M];
int acc,cur[10],v[10],prod[10];
int add,sum;
char ciuruit[M];
int ciur[M];
void un_fleac(){
	ciur[0]=0;
	for(int i=2;i<=1000000;i++){
		if(!ciuruit[i]){
			ciur[++ciur[0]]=i;
			for(int j=i;j<=1000000;j+=i){
				ciuruit[j]=1;
			}
		}
	}
}
int semn(int i){
	if(i%2==0) return 1;
	return -1;
}
int operate(int s,int x){
	int ras=s*stor[x];
	stor[x]++;
	return ras;
}
void back(int i){
	for(v[i]=v[i-1]+1;v[i]<=cur[0];v[i]++){
		prod[i]=prod[i-1]*cur[v[i]];
		add+=operate(semn(i),prod[i-1]*cur[v[i]]);
		if(i<cur[0]) back(i+1);
	}
}
int main(){
	un_fleac();
	prod[0]=1;
	in>>n;
	for(int i=1;i<=n;i++){
		in>>acc;
		cur[0]=0;
		for(int j=1;ciur[j]<=acc;j++){
			if(acc%ciur[j]==0){
				cur[++cur[0]]=ciur[j];
				while(acc%ciur[j]==0) acc/=ciur[j];
			}
		}
		//for(int j=1;j<=cur[0];j++) out<<cur[j]<<' ';out<<'\n';
		add=i-1;
		back(1);
		sum+=add;
	}
	out<<sum;
	return 0;
}