Cod sursa(job #2367689)

Utilizator mariastStoichitescu Maria mariast Data 5 martie 2019 11:58:40
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
using namespace std;
ifstream f ("ssnd.in");
ofstream g ("ssnd.out");

long long lgput(int a,int b){
    long long  put=1;
    a%=9973;
    while(b>0){
        if(b%2==1){
            b--;
            put=(a*put)%9973;
        }
        else b=b/2,a=(a*a)%9973;
    }
    return put;
}
long long i,j,vec[90000],k,n,x,p;
long long nrd,sd,p1,p2;
bool v[1000011];
int main()
{
    for(i=2;i<1000001;++i) {
        if(v[i]==0){
            vec[++k]=i;
            for(j=i+i;j<1000001;j+=i) {
                v[j] = 1;
            }
        }
    }
    f>>n;
    for(i=1;i<=n;i++){
        f>>x;
        nrd=1;
        sd=1;
        j=1;
        while(j<=k&&vec[j]*vec[j]<=x){
            if(x%vec[j]==0){
                p=0;
                while(x%vec[j]==0){
                    x/=vec[j];
                    p++;
                }
                nrd*=(p+1);
                p1=(lgput(vec[j],p+1)-1)%9973;
                p2=lgput(vec[j]-1,9971)%9973;
                sd=(((sd*p1)%9973)*p2)%9973;
            }
            j++;
        }
        if(x>1){
            nrd=nrd*2;
            sd=(sd*(x+1)%9973);
        }
        g<<nrd<<" "<<sd<<'\n';
    }
}