Cod sursa(job #1204974)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 4 iulie 2014 15:57:07
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<fstream>
#include<cmath>
#include<algorithm>
#include<bitset>
using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

const int modulo=9973;
const int MAD=1000000;
const int leg=100000;

int t,nr,primes[leg];
int form[leg],puteri[leg];
long long n,sum;
bitset<MAD+5>viz;

inline void Ciur()
{
    int i;
    long long j;
    primes[++primes[0]]=2;
    for (i=3;i<=MAD;i+=2)
        if (!viz[i])
            {
                primes[++primes[0]]=i;
                for (j=1LL*i*i;j<=MAD;j+=i) viz[j]=1;
            }
}

inline long long LOG(int x,int y)
{
    if (y==1) return x;
    else if (y&1) return x*LOG(x,y-1);
    else  return LOG(x,y>>1)*LOG(x,y>>1);
}

inline void SOLVE(long long x)
{
    int i,cont,root;
    nr=1;sum=1;

    i=1;puteri[0]=form[0]=0;
    while (i<=primes[0] && 1LL*primes[i]*primes[i]<=x)
        {
            cont=0;
            while (!(x%primes[i])) {x/=primes[i];cont++;}
            if (cont) {form[++form[0]]=primes[i];puteri[++puteri[0]]=cont;}
            i++;
        }
    if (x>1) {form[++form[0]]=x;puteri[++puteri[0]]=1;}

    for (i=1;i<=puteri[0];i++) nr=1LL*nr*(puteri[i]+1);
    fout<<nr<<" ";

    for (i=1;i<=form[0];i++)
        {
            sum=(1LL*sum*(((LOG(form[i],puteri[i]+1)-1)/(form[i]-1))));
            sum%=modulo;
        }
    fout<<sum<<"\n";
}

int main()
{
    fin>>t;
    Ciur();
    while (t--)
        {
            fin>>n;
            SOLVE(n);
        }
    return 0;
}