Cod sursa(job #2494978)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 18 noiembrie 2019 18:49:55
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
#define mod 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long t,n,i,j,nr,nr1,nr2,k,sol,p[300010],cnt;
pair<int,int> x[1010];
bitset<1000010> f;
int putere(int a,int b) {
    if (b==0)
        return 1;
    if (b==1)
        return a%mod;
    else {
        int crt=putere(a,b/2)%mod;
        crt=crt*crt%mod;
        if (b&1)
            return (a%mod*crt%mod)%mod;
        else
            return crt%mod;
    }
}
int main() {
    fin>>t;
    for (i=2;i<=1000000;i++) {
        if (f[i]==0)
            p[++cnt]=i;
        for (j=2*i;j<=1000000;j+=i)
            f[j]=1;
    }
    while (t--) {
        fin>>n;
        for (i=1;i<=1000;i++)
            x[i]={0,0};
        k=0;
        for (i=1;i<=cnt&&p[i]<=n/p[i]&&n!=1;i++) {
            if (n%p[i]==0) {
                x[++k].first=p[i];
                while (n%p[i]==0) {
                    n/=p[i];
                    x[k].second++;
                }
            }
        }
        sol=1;
        nr=nr1=nr2=1;
        if (n!=1)
            x[++k].first=n, x[k].second=1;
        for (i=1;i<=k;i++) {
            sol*=(x[i].second+1);
            nr1=putere(x[i].first,x[i].second+1)-1;
            if (nr1<0)
                nr1+=mod;
            nr1%=mod;
            nr2=x[i].first-1;
            nr2=putere(nr2,mod-2);
            nr2%=mod;
            nr*=(nr1%mod*nr2%mod);
        }
        fout<<sol<<" "<<nr<<"\n";
    }
    return 0;
}