Cod sursa(job #2497531)

Utilizator Raresr14Rosca Rares Raresr14 Data 22 noiembrie 2019 20:06:30
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int f[1000010],i,j,q,v[500010],k,w[500010];
long long n,d,h,sol,exp,x,s,y;
long long lgput(long long nr, long long m){
    long long r=1;
    while(m){
        if(m%2==1)
            r=(nr*r)%MOD;
        nr=(nr*nr)%MOD;
        m/=2;
    }
    return r;

}
int main(){
    for(i=2;i<=1000000;i++)
        if(f[i]==0){
           v[++k]=i;
           for(j=2*i;j<=1000000;j+=i)
                f[j]=1;
        }
    fin>>q;
    for(;q--;){
        fin>>n;
        d=h=sol=s=1;
        ///fout<<lgput(n)<<"\n";
        while(n!=1&&1LL*v[d]*v[d]<=n&&d<=k){
             if(n%v[d]==0){
                 exp=0;
                 ///w[++h]=v[d];
                 while(n%v[d]==0){
                        n/=v[d];
                        exp++;
                 }
                sol*=1LL*(exp+1);
                y=lgput(v[d],exp+1);
                y--;
                if(y<0)
                    y+=MOD;
                 x=lgput(v[d]-1,MOD-2);
                 s=(s*(x*y)%MOD)%MOD;
             }

             d++;
        }
        if(n!=1){
            sol*=2;
            y=lgput(n,2);
            y--;
            if(y<0)
                y+=MOD;
             x=lgput(n-1,MOD-2);
             s=(s*(x*y)%MOD)%MOD;
        }
        fout<<sol<<" "<<s<<"\n";

    }
    return 0;
}