Cod sursa(job #2037909)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 12 octombrie 2017 22:44:37
Problema Suma si numarul divizorilor Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <stdlib.h>

#define SqrtMax 100003
#define mod 9973

int t,nr;
int p[SqrtMax],v[SqrtMax];

int lgPow(int x, int p){
    int r = 1;
    while(p >= 1){
        if(p % 2 == 1){
            p--;
            r *= x;
            r %= mod;
        }
        x *= x;
        x %= mod;
        p /= 2;
    }
//    printf("%ld\n",r);
    return r % mod;
}
int main()
{
    for(int i = 2; i <= SqrtMax - 2; ++i){
        if(p[i] == 0){
            v[++nr] = i;
            for(int j = i + i; j <= SqrtMax - 2; j += i){
                p[j] = 1;
            }
        }
    }
    int n;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int e = 0, sum = 0, retin = n,ans1 = 1, ans2 = 1;
        for(int i = 1; i <= nr && v[i] * v[i] <= n; ++i){
            if(!(n % v[i])){
                int putere = 0;
                while(!(n % v[i])){
                    n /= v[i];
                    putere++;
                }
                ans1 *= (putere + 1); ans1 %= mod;

                ans2 *= ((lgPow(v[i],putere + 1) - 1 + mod) % mod); ans2 %= mod;
                ans2 *= (lgPow(v[i] - 1, mod - 2)); ans2 %= mod;

             //   printf("%intd %intd %intd %intd\n",v[i],putere,ans1,ans2);
            }
        }
        if(n > 1){
            ans1 *= 2; ans1 %= mod;
            ans2 *= (n + 1); ans2 %= mod;
        }
        printf("%d %d\n",ans1,ans2);
    }
    return 0;
}