Cod sursa(job #485046)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 16 septembrie 2010 20:55:23
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
// suma si nr. div. unui numar

# include <cstdio>
# include <math.h>
# include <algorithm>

using namespace std;

# define FIN "ssnd.in"
# define FOUT "ssnd.out"

const int MOD = 9973;
const int BND = 1000;
const int MAX_P = 80000;
const int MAX_S = 1000001;

int T, i, j, cnt, lim, d;
long long M, b, nrdiv, inv, sumdiv, pM;
bool prim[MAX_S];
int nrprim[MAX_P];

     int pow(int base, int N) {
         int rez = 1, temp;
         for (temp = 1; temp <= N; temp <<= 1, base = (base * base) % MOD)
            if (temp & N) rez = (rez * base) % MOD;
         return rez;
     }

     int main() {
         freopen(FIN, "r", stdin);
         freopen(FOUT, "w", stdout);
         
         memset(prim, true, sizeof(prim)); nrprim[cnt = 1] = 2;
         for (i = 3; i < MAX_S; i += 2)
            if (prim[i]) {
                nrprim[++cnt] = i;
                
                if (i <= BND) {
                   j = i * i;
                   for (; j < MAX_S; j += i) prim[j] = false;
                }
            }
         nrprim[++cnt] = MAX_S;
         
         scanf("%d", &T);
         for (; T; --T) {
             scanf("%lld", &M);
             
             lim = (int) sqrt(M); nrdiv = 1; sumdiv = 1; inv = 1;
             for (i = 1; nrprim[i] <= lim && M != 1; ++i)
                if (!(M % nrprim[i])) {
                   pM = M;
                   for (d = 1; !(M % nrprim[i]); ++d, M /= nrprim[i]);
                   nrdiv *= d;
                   inv = ((nrprim[i] - 1) * inv) % MOD;
                   sumdiv = (sumdiv * ((pM / M) * nrprim[i] + MOD - 1)) % MOD;
                }
                
             if (M != 1) {
                nrdiv <<= 1;
                inv = (inv * (M - 1)) % MOD;
                M %= MOD;
                sumdiv = (sumdiv * (M * M + MOD - 1)) % MOD;
             }
             
             printf("%lld %lld\n", nrdiv, (sumdiv * pow(inv, MOD - 2)) % MOD);
         }
         
         return 0;
     }