Cod sursa(job #485037)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 16 septembrie 2010 20:36:52
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 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;
bool prim[MAX_S];
int nrprim[MAX_P];

     int pow(int base, int N) {
         int rez = 1, temp;
         base %= MOD;
         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;
             for (i = 1; nrprim[i] <= lim && M != 1; ++i)
                if (!(M % nrprim[i])) {
                   d = 1; b = 1;
                   while (!(M % nrprim[i])) {
                        ++d;
                        M /= nrprim[i];
                        b *= nrprim[i];
                   }
                   nrdiv *= d;
                   b = (b * nrprim[i] + MOD - 1) % MOD;
                   inv = pow(nrprim[i] - 1, MOD - 2);
                   sumdiv = (sumdiv * b * inv) % MOD;
                }
                
             if (M != 1) {
                nrdiv <<= 1;
                inv = pow(M - 1, MOD - 2);
                M %= MOD; b = (M * M + MOD - 1) % MOD;
                sumdiv = (sumdiv * b * inv) % MOD;
             }
             
             printf("%lld %lld\n", nrdiv, sumdiv);
         }
         
         return 0;
     }