Cod sursa(job #2037893)

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

#define SqrtMax 100003
#define mod 9973
#define ll long long

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

ll lgPow(ll x, ll p){
    ll 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(ll i = 2; i <= SqrtMax - 2; ++i){
        if(p[i] == 0){
            v[++nr] = i;
            for(ll j = i + i; j <= SqrtMax - 2; j += i){
                p[j] = 1;
            }
        }
    }
    ll n;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        ll e = 0, sum = 0, retin = n,ans1 = 1, ans2 = 1;
        for(ll i = 1; i <= nr && v[i] * v[i] <= retin && n != 1; ++i){
            if(!(n % v[i])){
                ll putere = 0;
                while(!(n % v[i])){
                    n /= v[i];
                    putere++;
                }
                ans1 *= (putere + 1); ans1 %= mod;

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

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