Cod sursa(job #2195260)

Utilizator PredaBossPreda Andrei PredaBoss Data 15 aprilie 2018 20:15:06
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 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;
vector<pair<long long,int> >divizors;
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;
}
int sum()
{
    long long s=1;
    for(int i=0;i<divizors.size();i++)
        s=((s*(inv(divizors[i].first,divizors[i].second+1)-1)%rest)*inv(divizors[i].first-1,rest-2))%rest;
    return s;
}
int num()
{
    long long s=1;
    for(int i=0;i<divizors.size();i++)
        s=s*(divizors[i].second+1);
    return s;
}
void solve()
{
    divizors.clear();
    long long cop=nr;
    int oprite=sqrt(nr);
    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++;
        }
        divizors.push_back({nrprim[i],howmany});
        if(cop==1)
            break;
            i++;
    }
    if(cop>1)
        divizors.push_back({cop,1});
    fout<<num()<<" ";
    fout<<sum();
    fout<<"\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;
}