Cod sursa(job #478571)

Utilizator marius21Marius Petcu marius21 Data 19 august 2010 11:06:34
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <cstdlib>
#include <stdint.h>
#include <string>
#include <math.h>

#define MODNR 9973

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

uint8_t bif[1000000];
int a[300000];

void ciur(int n)
{
	memset(bif,1,n);
	int nrprimes=0;
	for (int i=2; i<n; i++)
	{
		if (!bif[i]) continue;
		a[nrprimes++]=i;
		for (int j=i*2; j<n; j+=i)
			bif[j]=0;
	}
	a[nrprimes]=-1;
}

int put(int a, int b)
{
	int p=1;
	for (int i=(sizeof(int)*8-2); i>=0; i--)
	{
		p=p*p;
		if (b&(1<<i))
			p*=a;
	}
	return p;
}

int main (int argc, char * const argv[]) {
	
	int t;
	fscanf(fin, "%d", &t);
	ciur(1000000);
    for (int i=0; i<t; i++)
	{
		int n;
		int s=1,nr=1;
		fscanf(fin, "%d", &n);
		int np=0,p;
		bool fallback=false;
		while (n>1)
		{
			if (!fallback)
			{
				p=a[np];
				if (p==-1)
				{
					p=a[np-1]+1;
					fallback=true;
				}
			}
			int f=0;
			int put=p;
			while (!(n%p))
			{
				f++;
				n/=p;
				put*=p;
			}
			nr*=f+1;
			s*=(put-1)/(p-1);
			s%=MODNR;
			if (fallback)
				p++;
			else
				np++;
		}
		fprintf(fout, "%d %d\n",nr,s);
	}
	fclose(fin);
	fclose(fout);
    return 0;
}