Nu aveti permisiuni pentru a descarca fisierul grader_test4.in

Cod sursa(job #485068)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 16 septembrie 2010 22:26:10
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
// suma si nr. div. unui numar

# include <cstdio>
# include <bitset>
# include <vector>
# include <algorithm>

using namespace std;

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

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

long long M, pM;
bitset <MAX_S> prim;
vector <int> nrprim;
int T, i, j, lim, d, nrdiv, inv, sumdiv;

     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);
         
         nrprim.push_back(2);
         for (i = 3; i <= BND; i += 2)
            if (!prim[i]) {
                nrprim.push_back(i);
                
                
                j = i * i;
                for (; j < MAX_S; j += i) prim[j] = 1;
         }
         for (i = BND + 1; i < MAX_S; i += 2)
            if (!prim[i]) nrprim.push_back(i);
         
         scanf("%d", &T);
         for (; T; --T) {
             scanf("%lld", &M);
             
             nrdiv = 1; sumdiv = 1; inv = 1;
             for (vector <int> :: iterator it = nrprim.begin(); it != nrprim.end() && *it * *it <= M && M > 1; ++it)
                if (!(M % *it)) {
                   pM = M;
                   for (d = 1; !(M % *it); ++d, M /= *it);
                   nrdiv *= d;
                   inv = ((*it - 1) * inv) % MOD;
                   sumdiv = (sumdiv * ((pM / M) % MOD * *it + MOD - 1) % MOD) % MOD;
                }
                
             if (M != 1) {
                nrdiv <<= 1;
                inv = (inv * (M + MOD - 1) % MOD) % MOD;
                M %= MOD;
                sumdiv = (sumdiv * (M * M + MOD - 1) % MOD ) % MOD;
             }
             
             printf("%d %d\n", nrdiv, (sumdiv * pow(inv, MOD - 2)) % MOD);
         }
         
         return 0;
     }