Cod sursa(job #2093482)

Utilizator patcasrarespatcas rares danut patcasrares Data 23 decembrie 2017 19:54:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#define DN 1000005
#define M 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long n;
int t,p[DN],nr,a[DN],f,nrd,s,x,y;
int putere(int a,int b)
{
    int r=1,p,c;
    a=a%M;
    while(b)
    {
        c=a;
        p=1;
        while(1)
        {
            if(2*p>b)
                break;
            c=c*c%M;
            p*=2;
        }
        b-=p;
        r=r*c%M;
    }
    return r;
}
int main()
{
    fin>>t;
    for(int i=2;i<DN;i++)
        if(a[i]==0)
        {
            nr++;
            p[nr]=i;
            for(int j=2*i;j<DN;j+=i)
                a[j]=1;
        }
    for(int h=1;h<=t;h++)
    {
        fin>>n;
        nrd=s=1;
        for(int i=1;i<=nr&&(long long)p[i]*p[i]<=n;i++)
            if(n%p[i]==0)
            {
                f=0;
                while(n%p[i]==0)
                {
                    f++;
                    n/=p[i];
                }
                nrd=nrd*(f+1);
                x=(putere(p[i],f+1)-1+M)%M;
                y=(putere(p[i]-1,M-2));
                s=(long long)x*y*s%M;
            }
        if(n!=1)
        {
            nrd*=2;
            s=(long long)s*(n+1)%M;
        }
        fout<<nrd<<' '<<s<<'\n';
    }
}