Cod sursa(job #1420661)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 18 aprilie 2015 20:05:33
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <algorithm>
#include <bitset>
#include <cmath>
#define NMAX 1000005
#define PMAX 500000
#define MOD 9973
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
 
int t, P[PMAX], nr, lim;
long long prod, sum, X;
bitset < NMAX > v;
 
void ciur(int N) {
  P[ ++P[0] ] = 2;
  
  for (int i = 4; i <= N; i += 2) v[i] = 1;
  
  for(int i = 3; i <= N; i +=2)
    if(!v[i]){
       P[ ++P[0] ] = i;
        for(int j = 2*i; j <=N ; j +=i)
                 if(!v[j]) v[j] = 1;
    }
}
 
long long lgput(long long N,long long K)
{
    if(K == 0)return 1;
    long long M = 1;
    while(K!=1)
        if(K % 2 == 0){
            N = (N*N) % MOD;
            K/=2;
        } else {
            M=(M*N) % MOD;
            --K;
        }
    return (N*M) % MOD;
}
 
int main() {
    f>>t; 
    ciur(NMAX-5);
    for (int test=1; test <= t; ++test) {
        f >> X; 
        prod = sum = 1;
        for (int i = 1; i <= nr && P[i]*P[i] <= X && X>1; ++i)
            if (X % P[i] == 0){
                int d=0;
                while (X % P[i] == 0) {
                  ++d;
                  X/=P[i];
                }
                prod *= (d+1);
                int x1=(lgput(P[i], d+1)-1) % MOD,
                x2=lgput(P[i]-1, MOD-2);
                sum=(sum*x1*x2) % MOD;
            }
        if (X>1) {
          prod *=2;
          sum=(sum * (X+1) ) % MOD;
        }
        g << prod << ' ' << sum << '\n';
    }
    return 0;
}