Cod sursa(job #941744)

Utilizator forgetHow Si Yu forget Data 19 aprilie 2013 17:00:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <cmath>
using namespace std;

int main()
{
	const int mod = 9973;
	bitset<1000000> isprime;
	vector<int> prime;
	vector<int>::iterator it;
	for (int i = 3; i < 1000000; i += 2)
		isprime[i] = false;
	for (int i = 3; i < 1000; i += 2)
		if (isprime[i])
			for (int j = i*i; j < 1000000; j += 2*i)
				isprime[j] = false;
	prime.push_back(2);
	for (int i = 3; i < 1000000; i += 2)
		if (isprime[i])
			prime.push_back(i);
	prime.push_back(1000003);

	ifstream fin("ssnd.in");
	ofstream fout("ssnd.out");
	int t;
	fin >> t;
	for (long long n; t > 0; --t) {
		fin >> n;
		int sqrtn = sqrt(n), cnt = 1, sum = 1;
		for (it = prime.begin(); *it <= sqrt(n); ++it) {
			if (n % *it == 0) {
				int icnt = 1, isum = 1, ipow = 1;
				do {
					n /= *it;
					++icnt;
					ipow = (ipow * *it)%mod;
					isum += ipow;
				} while (n % *it == 0);
				cnt *= icnt;
				sum = sum*(isum%mod)%mod;
			}
		}
		if (n != 1) {
			cnt *= 2;
			sum = sum*(1+n%mod)%mod;
		}
		fout << cnt <<  ' ' << sum << '\n';
	}
	return 0;
}