Cod sursa(job #1610597)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 23 februarie 2016 17:36:11
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
# include <fstream>
# define DIM 1000010
# define dim 78509
# define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int f[DIM],d[dim];
long long n,i,j,k,t,r,ok,nr,p,s,val1,val2,maxim,v[1001];
long long putere(long long a,long long b){
    if(b==0)
        return 1;
    else{
        long long x=putere(a,b/2);
        if(b%2==0)
            return (x*x)%MOD;
        else
            return (x*x*a)%MOD;
    }
}
int main () {
    fin>>t;
    for(i=1;i<=t;i++){
        fin>>v[i];
        if(v[i]>maxim)
            maxim=v[i];
    }
    for(i=2;i*i<=maxim+1;i++){
        if(f[i]==0){
            d[++k]=i;
            for(j=2*i;j*j<=maxim+1;j+=i)
                f[j]=1;
        }
    }
    for(r=1;r<=t;r++){
        n=v[r];
        i=1;
        s=1;
        p=1;
        while(n!=1&&i<=k&&d[i]*d[i]<=n){
            nr=0;
            while(n%d[i]==0){
                nr++;
                n/=d[i];
            }
            if(nr>1){
                val1=putere(d[i],nr+1);
                val2=putere(d[i]-1,MOD-2);
                if(val1-1>-1){
                    s*=(val1-1)*val2;
                    s%=MOD;
                }
                else{
                    s*=(MOD-1)*val2;
                    s%=MOD;
                }
            }
            else{
                if(nr==1){
                    s*=(d[i]+1);
                }
            }
            p*=(nr+1);
            i++;
        }
        if(n!=1){
            p*=2;
            s*=(n+1);
            s%=MOD;
        }
        fout<<p<<" "<<s<<"\n";
    }
    return 0;
}