Cod sursa(job #489095)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 30 septembrie 2010 23:03:38
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<cstdio>
#include<math.h>
#include<vector>
#define modulo 9973
using namespace std;

int er[1000003];

int main ()
{
	int ka,i,z,lim,j,fact[10000],exp,ok,nr,sum;
	long long v[1003],max,prec;
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%d",&z);
	max=0;
	for (i=1; i<=z; i++)
	{
		scanf("%I64d",&v[i]);
		if (v[i]>max) max=v[i];
	}
	lim=sqrt(max);
	ka=0;
	for (i=2; i<=lim; i++)
		if (er[i]==0) 
		{
			fact[++ka]=i;
			for (j=i+i; j<=lim; j+=i)
				er[j]=1;
		}
	for (i=1; i<=z; i++)
	{
		nr=1; sum=1; 
		ok=0;
		if (v[i]==1) printf("1 1\n");
		else
		{
			for (j=1; j<=ka; j++)
			{
				if (fact[j]>v[i]) break;
				if (v[i]==1) break;
				exp=0; prec=v[i];
				while (v[i]%fact[j]==0)
				{
					exp++;
					ok=1;
					v[i]/=fact[j];
				}
				nr*=(exp+1);
				sum*=(prec/v[i]*fact[j]-1)/(fact[j]-1);
				sum%=modulo;
			}
			if (ok==0) printf("2 %d\n",v[i]+1);
			else if (v[i]==1) printf("%d %d\n",nr,sum);
			else 
			{
				nr*=2;
				sum*=(v[i]*v[i]-1)/(v[i]-1);
				sum%=modulo;
				printf("%d %d\n",nr,sum);
			}
		}
	}
	return 0;
}