Cod sursa(job #419638)

Utilizator darrenRares Buhai darren Data 17 martie 2010 19:18:22
Problema Ordine Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<fstream>
#include<string>
#include<algorithm>
using namespace std;

void gen();
void read();
void calc();
void write();

bool pr[1005];
char a[1005];
long b[26],p[1005],mx;
long long c[1005],d[1005];
int size;

int main() {
	gen();
	read();
	calc();
	write();
	return 0;
}

void gen() {
	int i,j,t=0;
	p[0]=2;
	for (i=3;i<=1000;i+=2) {
		if (!pr[i]) {
			p[++t]=i;
			for (j=i*i;j<=1000;j+=i<<1)
				pr[j]=1;
		}
	}
	pr[2]=0;
}

void read() {
	ifstream fin("ordine.in");
	fin>>a;
	size=strlen(a);
	for (int i=0;i<size;++i) {
		b[a[i]-'a']++;
	}
	fin.close();
}

void calc() {
	int aux,i,j,l,init;
	for (i=2;i<=size;++i) {
		aux=i;
		init=aux;
		if (!pr[aux] && (aux%2==1 || aux==2)) {
			for (j=0;p[j]!=aux;++j);
			++c[j];
			if (j>mx)
				mx=j;
		}
		else
		for (j=0;p[j]<=init/2 && aux!=1;++j)
			while (aux%p[j]==0) {
				aux/=p[j];
				++c[j];
				if (j>mx)
					mx=j;
			}
	}
	int aux2;
	for (i=0;i<26;++i) {
		aux=b[i];
		if (aux>1)
			for (l=2;l<=aux;++l) {
				aux2=l;
				init=aux;
				if (!pr[aux2] && (aux2%2==1 || aux2==2)) {
					for (j=0;p[j]!=aux2;++j);
						++d[j];
				}
				else
					for (j=0;p[j]<=init/2 && aux2!=1;++j)
						while (aux2%p[j]==0) {
							aux2/=p[j];
							++d[j];
						}
			}
	}
}

void write() {
	ofstream fout("ordine.out");
	int i;
	for (i=0;i<=mx;++i)
		if (c[i]-d[i]>0)
			fout<<p[i]<<' '<<c[i]-d[i]<<'\n';
	fout.close();
}