Cod sursa(job #2946837)

Utilizator staicumateiStaicu Matei Octavian staicumatei Data 25 noiembrie 2022 10:12:31
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

const int RAD = 1e6;
const int MOD = 9973;

vector <int> prime, inv(MOD);

int putere(int a, int n)
{
    int p=1;
    while(n!=0)
    {
        if(n%2==1)
        {
            p=p*a%MOD;
        }
        a=a*a%MOD;
        n=n/2;
    }
    return p;
}
int invers(int a)
{
    return putere(a, MOD-2);
}
void prec()
{
    bitset <1+RAD> c;
    for(int i=2;i*i<=RAD;i++)
    {
        if(!c[i])
        {
            for(int mult=i*i;mult<=RAD;mult=mult+i)
            {
                c[mult]=1;
            }
        }
    }
    for(int i=2;i*i<=RAD;i++)
    {
        if(!c[i])
        {
            prime.push_back(i);
        }
    }
    for(int i=1;i<MOD;i++)
    {
        inv[i]=invers(i);
    }
}
void ssnd(long long n,long long &nrd, int &sd)
{
    nrd=1;
    sd=1;
    int i=0;
    while(i<(int)prime.size() && (long long)prime[i]*prime[i]<=n)
    {
        if(n%prime[i]==0)
        {
            long long p=1;
            int e=0;
            while(n%prime[i]==0)
            {
                e++;
                p=p*prime[i]%MOD;
                n=n/prime[i];
            }
            p=p*prime[i]%MOD;
            nrd=nrd*(e+1);
            sd=sd*(p+MOD-1)%MOD*inv[(prime[i]+MOD-1)%MOD]%MOD;
        }
        i++;
    }
    if(n!=1)
    {
        nrd=nrd*2;
        sd=sd*((n+1)%MOD)%MOD;
    }
}
int main()
{
    prec();
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");
    int t,i;
    f>>t;
    for(i=0;i<t;i++)
    {
        long long n;
        f>>n;
        long long nrd;
        int sd;
        ssnd(n,nrd,sd);
        g<<nrd<<" "<<sd<<endl;
    }
    return 0;
}