Cod sursa(job #1490806)

Utilizator LurchssLaurentiu Duma Lurchss Data 24 septembrie 2015 10:30:27
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <math.h>

#define max 1000003
#define MOD 9973
using namespace std;

int n;
bitset<max> prim;
vector<pair<int,int> > v;

int nr;
int lgput(int x,int n)
{
    if(n==0)
        return 1;
    if(n%2==0)
        return lgput((x*x)%MOD,n/2)%MOD;
    return (lgput(x,n-1)%MOD*x)%MOD;
}

void descomp()
{
    int nrdiv=nr;
    int ndiv=0;
        while(nr%2==0)
            nr/=2,ndiv++;
    if(ndiv)
        v.push_back(make_pair(2,ndiv));
    for(int i=2;i<=sqrt(nrdiv);i+=2)
        prim[i]=1;
    ndiv=0;
    for(int i=3;i<=sqrt(nrdiv);i+=2,ndiv=0)
     {
        if(prim[i]==1)
            continue;
        while(nr%i==0)
            nr/=i,ndiv++;
        if(ndiv)
            v.push_back(make_pair(i,ndiv));
        for(int j=i;j<=sqrt(nr);j+=i)
            prim[j]=1;
    }
    if(nr!=1)
        v.push_back(make_pair(nr,1));
}

int nr_div()
{
    int nrdiv=v[0].second+1;
    for(int i=1;i<v.size();i++)
        {nrdiv*=v[i].second+1;
        nrdiv%=MOD;}
    return nrdiv;
}

int sum_div()
{
    int sdiv=1;
    for(int i=0;i<v.size();i++)
        {sdiv*=lgput(v[i].first,v[i].second+1)-1;
        sdiv%=MOD;
        sdiv*=lgput(v[i].first-1,MOD-2);
        sdiv%=MOD;
        }
    return sdiv;
}

void solve()
{
    for(int i=1;i<=n;i++,v.clear(),prim=0)
        {
            scanf("%d ",&nr);
            descomp();
            printf("%d %d\n",nr_div(),sum_div());
        }
}
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d ",&n);
    solve();
    return 0;
}