Cod sursa(job #1396986)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 23 martie 2015 10:40:23
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <cstdio>
#include <cmath>
bool ciur[1000001];
int prime[80001];
int t;
long long n;
int put(int b,int putere)
{
    if(putere==0) return 1;
    if(putere==1) return b;
    int temp=put(b,putere/2);
    return (temp*temp*put(b,(putere%2)))%9973;
}
int main()
{
    freopen ("ssnd.in","r",stdin);
    freopen ("ssnd.out","w",stdout);
    int ct=1;
    for(int i=2;i<=1000000;i++)
    {
            if(ciur[i]==0)
            {
                          for(int j=i;j<=1000000/i;j++) ciur[i*j]=1;
            }
    }
    for(int i=2;i<=1000000;i++)
    {
            if(ciur[i]==0)
            {
                          prime[ct]=i;                  
                          ct++;
            }
    }
    scanf("%d",&t);
    for(int x=1;x<=t;x++)
    {
            long long pcard=1,psum=1;
            scanf("%lld",&n);
            int lun=sqrt(n)+1;
            for(int i=1;i<ct&&prime[i]*prime[i]<=n;i++)
            {
                    if(n%prime[i]==0)
                    {
                                     int c=0;
                                     while(n%prime[i]==0)
                                     {
                                                         n/=prime[i];
                                                         c++;
                                     }
                                    //if(ct==-100) printf("%d %d\n",prime[i],c+1,put(prime[i],c+1));
                                     pcard*=(c+1);
                                     psum*=(put(prime[i],c+1)-1);
                                     psum/=(prime[i]-1);
                                     psum%=9973;
                                     if(n==1) break;
                    }
            }
            if(n!=1)
            {
                    pcard*=2;
                    psum*=(n*n-1);
                    psum/=(n-1);
                    psum%=9973;
            }
            printf("%lld %lld\n",pcard,psum);
    }
}