Cod sursa(job #799522)

Utilizator enedumitruene dumitru enedumitru Data 19 octombrie 2012 10:37:37
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <fstream>
#define LL long long
#define MOD 9973
using namespace std;
int t,nr;
LL n,nrdiv;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

const int MAXSIZE = 1000001;
int r [80000];
char w [MAXSIZE]; //w[i] == 0 if i is prime
inline void ciur() 
{	int i, j;
	for (i = 2; i <= 1000000; ++i) 
		if (w[i] == 0) 
		{	r[++nr]=i;
			for (j = i + i; j <= 1000000; j += i) w[j] = 1;
		}	
	}
inline LL calc(LL a, int k)
{ 	LL p=a;
	while(--k) p*=a;
	return p;
}
inline void desc( LL n )
{	int i = 1,d; 
	LL nrdiv=1,prod,sum=1;
	while(r[i]*r[i]<=n)
	{	if(!(n%r[i]))
		{	
			d = 0; prod=1;
			while(!(n%r[i]))
			{	d++;
				n/=r[i];
			}
			d++;
			//prod = calc(r[i],d)-1;
			prod = ((calc(r[i],d)-1) / (r[i]-1)) % MOD;
			sum = (sum * prod) % MOD;
			nrdiv = nrdiv * d;
		}
		++i;
	}
	if(n>1) 
		{	nrdiv = nrdiv * 2;
			sum = (sum * (n+1)) % MOD;
		}
	g<<nrdiv<<' '<<sum<<'\n';
}

int main()
{
	ciur();
	f >> t;
	while(t--)
	{
		f >> n;
		desc( n );
	}
	g.close(); return 0;
}
/*
#include <stdio.h>

char nuprim[1000002];
int p[300000];

int main()
{
    FILE *f, *g;
    f=fopen("ssnd.in","r");
    g=fopen("ssnd.out","w");

    int i,j,t,nr=0, e;
    long long n,numar,suma,pu;
    fscanf(f,"%d",&t);

    //printf("am ajuns aici\n");

    for(i=2;i*i<=1000000;i++)
    {
        if(nuprim[i]==0)
        {
            for(j=i*i;j<=1000000;j+=i) nuprim[j]=1;
        }
    }

    //printf("am ajuns aici\n");

    for(i=2;i<=1000000;i++) if(nuprim[i]==0) p[++nr]=i;

    for(i=1;i<=t;i++)
    {
        //printf("am ajuns aici\n");
        numar=1; suma=1;
        fscanf(f,"%lld",&n);
        for(j=1;(long long) p[j]*p[j]<=n;j++)
        {
            if(n%p[j]==0)
            {
                pu=1; e=0;
                while(n%p[j]==0)
                {
                    e++;
                    pu*=p[j];
                    n/=p[j];
                }
                numar*=(e+1);
                suma=(suma*(pu*p[j]-1)/(p[j]-1))%9973;
            }
        }
        //printf("am ajuns aici\n");
        if(n!=1)
        {
            numar*=2;
            suma=(suma*(n+1))%9973;
        }
        fprintf(g,"%lld %lld\n",numar,suma);
    }
    return 0;

}

*/