Cod sursa(job #1795896)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 2 noiembrie 2016 22:19:17
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
# include <fstream>
# include <bitset>
# define DIM 1000010
# define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bitset <DIM> f;
int d[2*DIM/10],t,k,i,j,r,ndiv,sdiv,p,nr;
long long n,x,y;
int euclid(long long a,long long b,long long &x,long long &y){
    if(!b){
        x=1;
        y=0;
        return a;
    }
    long long xa,ya,d=euclid(b,a%b,xa,ya);
    x=ya;
    y=xa-(a/b)*ya;
}
int main () {
    for(i=2;i<=DIM-5;i++){
        if(!f[i]){
            d[++k]=i;
            for(j=2*i;j<=DIM-5;j+=i)
                f[j]=1;
        }
    }
    fin>>t;
    for(r=1;r<=t;r++){
        fin>>n;
        i=1;
        ndiv=1;
        sdiv=1;
        while(n!=1&&i<=k){
            p=1;
            nr=0;
            while(n%d[i]==0){
                n/=d[i];
                p*=d[i];
                p%=MOD;
                nr++;
            }
            ndiv*=(nr+1);
            if(nr){
                p*=d[i];
                p%=MOD;
                p--;
                if(p<0)
                    p+=MOD;
                euclid(d[i]-1,MOD,x,y);
                if(x<0)
                    x+=MOD;
                x%=MOD;
                p*=x;
                p%=MOD;
                sdiv*=p;
                sdiv%=MOD;
            }
            i++;
        }
        if(n>1){
            ndiv*=2;
            n%=MOD;
            p=n;
            p*=p;
            p%=MOD;
            p--;
            if(p<0)
                p+=MOD;
            euclid(n-1,MOD,x,y);
            if(x<0)
                x+=MOD;
            x%=MOD;
            p*=x;
            p%=MOD;
            sdiv*=p;
            sdiv%=MOD;
        }
        fout<<ndiv<<" "<<sdiv<<"\n";
    }
    return 0;
}