Cod sursa(job #440929)

Utilizator nandoLicker Nandor nando Data 12 aprilie 2010 17:48:45
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <bitset>
using namespace std;

FILE* fin=fopen("ssnd.in","r");
FILE* fout=fopen("ssnd.out","w");

#define MAXP 1000000
#define MOD 9973

typedef long long int64;

int prim[80000],np=0;
bitset<MAXP> era;

inline int64 pow(int64 a,int64 p){
	int64 x=a,r=1;
	while(p){
		if(p&1){
			r=(r*x)%MOD;
		}
		x=(x*x)%MOD,p>>=1;
	}
	return r;
}

void ciur(){
	for(int i=1;((i*i)<<1)+(i<<1)<MAXP;++i){
		if(!era[i]){
			for(int j=((i*i)<<1)+(i<<1);(j<<1)+1<MAXP;j+=(i<<1)+1){
				era[j]=true;
			}	
		}
	}
	prim[np++]=2;
	for(int i=1;(i<<1)+1<MAXP;i++){
		if(!era[i]){
			prim[np++]=(i<<1)+1;
		}
	}
}	

void doTest(int64 nr){
	int64 nd=1,sd=1,d=0,p=0,sp,n=nr;
	while(int64(prim[d])*int64(prim[d])<=nr){
		if(nr%prim[d]==0){
			p=0,sp=prim[d];
			while(n%prim[d]==0){
				p++,n/=prim[d],sp*=prim[d];
			}
			if(p!=0){
				nd=(nd*((p+1)%MOD))%MOD;
				sd=(((sd*((sp - 1) % MOD))%MOD)*(pow(prim[d]-1, MOD-2)))%MOD;
			}
		}
		d++;
	}
	if(n>1){
		nd=(nd*2)%MOD; 
		sd=(((sd*((n*n - 1) % MOD))%MOD)*(pow(n-1, MOD-2)))%MOD;
	}
	fprintf(fout,"%lld %lld\n",nd,sd);
}

int main(){
	int t;
	int64 k;
	
	ciur();

	fscanf(fin,"%d ",&t);
	for(int i=0;i<t;i++){
		fscanf(fin,"%lld\n",&k);
		doTest(k);
	}
	fclose(fin);
	fclose(fout);
	return 0;
}