Cod sursa(job #840485)

Utilizator alexalbu95Albu Alexandru alexalbu95 Data 22 decembrie 2012 19:25:41
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <bitset>
#include <cmath>

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

typedef unsigned long long int lung;
static const int maxp = 1000005;
static const int mod = 9973;

lung n;
int t, i, k=1, v[maxp];
bitset<maxp> a;

void ciur()
{

    long long i, j, x=sqrt(maxp);
    for(i=2; i<=x; ++i)
        for(j=i*i; j<=maxp; j+=i) a[j]=1;

    v[k]=2;
    for(i=3; i<=maxp; i+=2)
        if(a[i]==0) v[++k]=i;
}
/*
void ciur()
{
    int i, j;
    k=1;
    v[1]=2;
    for(i=3; i<=maxp; i+=2)
    {
        if(a[i]==0) v[++k]=i;
        for (j=3*i; j<=maxp; j+= (i<<1)) a[j]=1;
    }
}*/

void solve()
{
    lung sum=1, nrd=1;

    f>>n;

    for (int i=1; i<=k && (lung) v[i] * v[i] <= n; ++i)
    {
        if(n % v[i] == 0)
        {
            int p=1;
            lung x=v[i];
            while(n % v[i] == 0)
            {
                x *= v[i];
                n /= v[i];
                ++p;
            }

            nrd *= p;
            nrd %= mod;

            sum *= (x-1)/(v[i]-1);
            sum %= mod;
        }
    }

    if(n > 1)
    {
        nrd <<= 1;
        sum = ( (lung) sum*(n+1) % mod);
    }

    g<<nrd<<" "<<sum<<"\n";
}

int main()
{
    ciur();
    for (f>>t; t; t--) solve();
}