Cod sursa(job #963923)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 19 iunie 2013 18:33:23
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");

/* 
 * File:   ciur.h
 * Author: Victor
 *
 * Created on June 19, 2013, 5:19 PM
 */

#ifndef CIUR_H
#define	CIUR_H

#include <bitset>
#include <vector>
#include <math.h>
using namespace std;
#define max_size 1000013
#define modulo 9973	

class ciur
{
public:
	ciur(){ generate(); }
	void generate(){
		int i = 2, l = (int)sqrt(max_size);
		for(int i=2;i<max_size;i++) bb[i]=1;
		while(i <= l)
		{
			if(!bb[i]){ i++; continue; }
			for(int j=i*i;j<max_size;j+=i) bb[j] = 0;
			i++;
		}
	}
	bool isprime(int x){
		return bb[x];
	}
	void getprimes()
	{
		pp.clear();
		for(int i=0;i<max_size;i++)
			if(isprime(i))pp.push_back(i);
	}
	void desc(vector<pair<int,int> >&ff, long long x)
	{
		int i = 0, p, l = pp.size();
		ff.clear();
		while(x != 1 && i < l && (long long)pp[i]*pp[i] <= x)
		{
			if(x%pp[i]!=0){ i++; continue; }
			p=0;
			while(x%pp[i]==0){ x/=pp[i]; p++; }
			ff.push_back(make_pair(pp[i],p));
			i++;
		}
		if(x != 1)
			ff.push_back(make_pair(x,1));
	}
	void ssnd(pair<long long, long long>&ss, long long x){
		ss = make_pair(1,1);
		vector<pair<int,int> >ff;
		desc(ff, x);
		int l = ff.size();
		for(int i=0;i<l;i++)
		{
			ss.first *= ff[i].second+1;
			ss.second = (ss.second*((long long)(pow(ff[i].first, ff[i].second+1)-1)/(ff[i].first-1)))%modulo;
		}
	}
private:
    bitset<max_size>bb;
	vector<int>pp;
};

#endif	/* CIUR_H */

ciur a;
int n;
long long x;

int main(){
	f >> n;
	a.getprimes();
	for(int i=0;i<n;i++){
		f >> x;
		pair<long long,long long> ss(0,0);
		a.ssnd(ss,x);
		g << ss.first << " " << ss.second << endl;
	}
	return 0;
}