Cod sursa(job #2195264)

Utilizator PredaBossPreda Andrei PredaBoss Data 15 aprilie 2018 20:37:24
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define rest 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int t;
bitset<1000001>ap;
vector<int>nrprim;
long long nr,lenght;
int inv(long long n,int power)
{
    long long a=n;
    long long i=0;
    long long rez=1;
    while((1<<i)<=power)
    {
        if(((1<<i)&power)!=0)
            rez=(rez*a)%rest;
        a=(a*a)%rest;
        i++;
    }
    return rez;
}
void solve()
{
    long long cop=nr;
    int oprite=sqrt(nr);
    long long n=1,s=1;
    int i=0;
    while(nrprim[i]<=oprite && nrprim[i]<=cop)
    {
        if(cop%nrprim[i]!=0)
        {
            i++;
            continue;
        }
        long long howmany=0;
        while(cop%nrprim[i]==0)
        {
            cop/=nrprim[i];
            howmany++;
        }
        n*=(howmany+1);
        int p1=(inv(nrprim[i],howmany+1)-1)%rest;
        int p2=inv(nrprim[i]-1,rest-2)%rest;
        s=(((s*p1)%rest)*p2)%rest;
        if(cop==1)
            break;
            i++;
    }
    if(cop>1)
    {
        n*=2;
        s=(1LL*s*(cop+1))%rest;
    }
    fout<<n<<" "<<s<<"\n";
}
void ciur()
{
    for(int i=2;i<=1000000;i++)
    {
        if(ap[i])
            continue;
        int j=2*i;
        while(j<=1000000)
        {
            ap[j]=1;
            j+=i;
        }
        nrprim.push_back(i);
    }
    lenght=nrprim.size();
}
int main()
{
    fin>>t;
    ciur();
    for(int i=1;i<=t;i++)
    {
        fin>>nr;
        solve();
    }
    return 0;
}