Cod sursa(job #1184941)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 14 mai 2014 17:59:41
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <bitset>
#define NMax 1000001
#define MOD 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int t, l, prime[NMax], numpr, k, sumd, nrd;
long long num;
bitset<10000010> ciur;
inline void erast()
{
    ciur[1]=1;
    for (int i=2; i<=1000001; i++)
        if (ciur[i]==0)
            for (int j=2; j*i<=1000001; j++)
                ciur[j*i]=1;
}
inline long long powd(long long base, int powr)
{
    long long res=1;
    while (powr!=0) {
        if (powr%2==1)
            res*=base;
        base*=base;
        powr=powr/2;
    }
    return res;
}
int main()
{
    erast();
    for (int i=1; i<=1000001; i++)
        if(ciur[i]==0)
            prime[++k]=i;
    f>>t;
    for (l=1; l<=t; l++)
    {
        f>>num;
        nrd=1;
        sumd=1;
        for (int i=1; 1LL*prime[i]*prime[i]<=num; i++) {
            int powr=0;
            while (num%prime[i]==0) {
                powr++;
                num/=prime[i];
            }
            nrd=(nrd*(1+powr))%MOD;
            sumd=(sumd*(powd(prime[i], powr+1)-1)/(prime[i]-1))%MOD;
        }
        if (num!=1) {
            nrd=(nrd*2)%MOD;
            sumd=(sumd*(powd(num, 2)-1)/(num-1))%MOD;
        }
        g<<nrd<<" "<<sumd<<"\n";
    }
    return 0;
}