Cod sursa(job #739356)

Utilizator alexalbu95Albu Alexandru alexalbu95 Data 22 aprilie 2012 20:21:00
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <bitset>

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, v[maxp];
bitset<maxp> a;

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();
}