Cod sursa(job #406789)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 martie 2010 20:02:55
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <fstream>

using namespace std;

#define file_in "ssnd.in"
#define file_out "ssnd.out"

#define Mod 9973
#define Nmax 1000001


int T;
long long n,N;
int i,e,d,nrd,suma,p,nd,j;
int viz[Nmax],q[Nmax];

int my_pow(int a,int b)
{
    int t;
    
    if (!b) 
		return 1;
    t=my_pow(a,b>>1);
    t=(t*t)%Mod;
    if (b&1)
		t=(t*a)%Mod;
    return t;
}

void ciur()
{
	for (i=2;i<Nmax;++i)
		 if (viz[i]==0)
		 {
			 q[++nd]=i;
			 for (j=i+i;j<Nmax;j+=i)
				  viz[j]=1;
		 }
}

int main()
{
	//freopen(file_in,"r",stdin);
	//freopen(file_out,"w",stdout);
	ifstream fin (file_in);
	ofstream fout (file_out);
	
	//scanf("%d", &T);
	fin >> T;
	
	/*for (i=1;i<Mod;++i)
        inv[i]=my_pow(i,Mod-2);*/

	ciur();
	while(T--)
	{
		//scanf("%d", &N);
		fin >> N;
		nrd=suma=1;
		
		n=N;
		for (i=1;1LL*q[i]*q[i]<=N;++i)
		{
			if (N%q[i]!=0)
				continue;
			
			e=0;
			int ee=1;
			while(n%q[i]==0)
			{
				n/=q[i];
				e++;
				ee*=q[i];
			}
			
			nrd*=(e+1);
			suma*=((1LL*ee*q[i]-1)%Mod);
			suma%=Mod;
			suma*=my_pow(q[i]-1,Mod-2);
			suma%=Mod;
		}
		
		if (n>1)
		{
			nrd*=2;
			suma*=((1LL*n*n-1)%Mod);
		    suma%=Mod;
			suma*=my_pow(n-1,Mod-2);
			suma%=Mod;
		}
		
		//printf("%d %d\n", nrd,suma);
		fout << nrd <<" " << suma<<"\n";

	}
	
	
	//fclose(stdin);
	//fclose(stdout);
	
	return 0;
	
}