Cod sursa(job #963913)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 19 iunie 2013 18:12:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 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 2000013
#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 desc(vector<pair<int,int> >&ff, long long x)
	{
		int i = 2, p;
		ff.clear();
		while(x != 1 && i < max_size && (long long)i*i <= x)
		{
			if(!bb[i] || x%i!=0){ i++; continue; }
			p=0;
			while(x%i==0){ x/=i; p++; }
			ff.push_back(make_pair(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);
		for(int i=0;i<ff.size();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;
};

#endif	/* CIUR_H */

ciur a;
int n;
long long x;

int main(){
	f >> n;
	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;
}