Cod sursa(job #467756)

Utilizator S7012MYPetru Trimbitas S7012MY Data 30 iunie 2010 13:24:42
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <bitset>
#include <vector>
#define DN 1000001
#define REST 9973
using namespace std;

bitset <1000004> ciur;
vector<int>::iterator it;
vector <int> prime;

void c() {
	for(int i=2; i<=DN; i++)
		if(!ciur[i]) {
			prime.push_back(i);
			for(int j=i+i; j<=DN;j+=i) ciur[j]=1;
		}
}

inline int pow(int x, int p) {
	int rez = 1;
	x %= REST;

	for(; p; p >>= 1) {
		if(p & 1) {
			rez *= x;
			rez %= REST;
		}
		x *= x;
		x %= REST;
	}

	return rez;
}


int main()
{
	int t,nd,sd,p,s;
	long long n,cn;
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	c();
	for(scanf("%d",&t);t;t--) {
		scanf("%lld",&n);
		cn=n;
		nd=sd=1;
		for(it=prime.begin(); (long long)(*it)*(*it)<=n; it++)
			if(!(n%(*it))) {
				p=0,s=1;
				while(!(cn%(*it))) {
					cn/=(*it);
					s*=(*it);
					p++;
				}
				nd*=(p+1);
				sd *= ((1LL*s*(*it) - 1) % REST);
				sd %= REST;
				sd *= pow((*it)-1, REST-2);
				sd %= REST;
			}
		if(cn > 1) {
			nd *= 2;
			sd = (1LL*sd*(cn+1) % REST);
		}
		printf("%d %d\n",nd,sd);
	}
	return 0;
}