Cod sursa(job #2495248)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 18 noiembrie 2019 23:30:13
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <bitset>
#define mod 9973
using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

long long n;
int t,i,j,p[1000010],m,sum,nr,cnt,x,y,d;
bitset <1000010> f;

int pow(int a, int b){
    int r=1;
    a%=mod;

    while(b){
        if(b&1)
            r=r*a%mod;
        a=a*a%mod;
        b>>=1;
    }

    return r;
}

int main(){
    p[m=1]=2;
    for(i=3;i<=1000000;i+=2){
        if(!f[i]){
            p[++m]=i;

            for(j=3*i;j<=1000000;j+=2*i)
                f[j]=1;
        }
    }

    for(fin>>t;t;t--){
        fin>>n;

        sum=1; nr=1;

        for(i=1;n!=1 && 1LL*p[i]*p[i]<=n;i++){
            if(n%p[i]==0){
                cnt=1; d=p[i];

                while(n%d==0){
                    cnt++;
                    n/=d;
                }

                nr*=cnt;

                x=pow(d,cnt);
                x--;
                if(x<0)
                    x+=mod;
                y=pow((d-1+mod)%mod,mod-2);
                x=x*y%mod;
                sum=sum*x%mod;
            }
        }

        if(n!=1){
            cnt=2; d=n%mod;
            nr*=cnt;

            x=pow(d,cnt);
            x--;
            if(x<0)
                x+=mod;
            y=pow((d-1+mod)%mod,mod-2);
            x=x*y%mod;
            sum=sum*x%mod;
        }

        fout<<nr<<" "<<sum<<"\n";
    }

    return 0;
}