Cod sursa(job #664450)

Utilizator razvan_kusztosKusztos razvan razvan_kusztos Data 20 ianuarie 2012 09:27:51
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <cmath>
#define M 1000000
#define mod 9973
bool ok[M];
using namespace std;
int T,c[M];
long long a,x,b,i,ndiv,s=1,nr,k;

long long powe(int a,int b)
{
    if (b==0) return 1;
    if (b%2==0)
        {
            long long aux=powe(a,b/2);
            return (aux*aux);
        }
    if (b%2==1) return (a*powe(a,b-1));
}

void ciur()
     {
        for(int i=2;i<M;i++)
        {
		    if(ok[i] == false)
		      {
			     c[++k] = i;
                 for(int j=i+i;j<M;j+=i)
                 {
				    ok[j] = true;
		 	     }
		}
	}
     }

int main() {
        freopen("ssnd.in","r",stdin);
        freopen("ssnd.out","w",stdout);
        scanf("%d",&T);
        ciur();
        for(;T;T--)
        {
            s=1LL;
            ndiv=1;
            scanf("%d",&a);
            x=a;
            for (i=1;c[i]*c[i]<a;i++)
             {
                 nr=0;
                 while(x%c[i]==0)
                     {
                         nr++;
                         x/=c[i];
                     }
                     ndiv *= (nr+1);
                     long long  p=(powe(c[i],nr+1)-1)/(c[i]-1);
                     s*=p ; s%=mod;
             }
             if (x>1)
             {
                ndiv *= 2;
                s = s * (x+1)%mod;
                s%=mod;
             }
        printf("%lld ",ndiv);
        printf("%lld\n",s);
        }
    }