Cod sursa(job #3297942)

Utilizator calinarulMarinescu Calin calinarul Data 24 mai 2025 22:17:08
Problema Suma si numarul divizorilor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <vector>
#include <bitset>
#define pb push_back
#define endl '\n'
#define int long long 
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
const int NMAX=1e7+5;
const int MOD=9973;
vector<int>primes;
bitset<NMAX>ciur;
int ridicare(int a,int b)
{
    int p=1;
    while(b)
    {
        if(b%2==1)
        p=(p%MOD * a%MOD)%MOD;
        a=(a%MOD*a%MOD)%MOD;
        b/=2;
    }
    return p;
}
void eratostene()
{
    primes.pb(2);
    ciur[0]=1;ciur[1]=1;
    for(int i=4;i<=NMAX;i+=2)
    {
        ciur[i]=1;
    }
    for(int i=3;i*i<=NMAX;i+=2)
    {
        if(!ciur[i])
        {
            primes.pb(i);
            for(int j=i*i;j<=NMAX;j+=i)
            {
                ciur[j]=1;
            }
        }
    }
}
signed main()
{
    int t;
    eratostene();
    fin>>t;
    while(t--)
    {
        int n;
        fin>>n;
        int cnt=0;
        int d=1;
        int s=1;
        if(!ciur[n])
        {
            fout<<"2"<<" "<<n+1<<endl;
            continue;
        }
        while(n>1)
        {
            int p=primes[cnt];
            int cati=0;
            if(n%p==0){
            while(n%p==0)
            {
                cati++;
                n/=p;
            }
            cati++;
            d=(d%MOD * (cati)%MOD)%MOD;
            s=(s%MOD*( (ridicare(p,cati)%MOD -1 )%MOD * ridicare(p-1,MOD-2)%MOD )%MOD)%MOD;
        }
        cnt++;
        if(primes[cnt]*primes[cnt]>n && n>1)
        {
            cati=2;
            p=n;
            d=(d%MOD * (cati)%MOD)%MOD;
            s=(s%MOD*( (ridicare(p,cati)%MOD -1 )%MOD * ridicare(p-1,MOD-2)%MOD )%MOD)%MOD;
            break;
        }
        }
        fout<<d<<" "<<s<<endl;
    }
}