Cod sursa(job #1340431)

Utilizator MaarcellKurt Godel Maarcell Data 11 februarie 2015 20:05:03
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <bitset>
#define prim 9973
#define MAXN 1000000
#define LL long long int
using namespace std;

int T,K,p[80000]; bitset<MAXN+5> v;

void sieve(){
    int i,j;
    p[++K]=2;
    for (i=3; i<=MAXN; i+=2)
        if (v[i]==0){
            p[++K]=i;
            for (j=2*i; j<=MAXN; j+=i)
                v[j]=1;
        }
}

inline int fpow(int x, int p){
    int res=1;

    while (p){
        if (p&1)
            res=(res*x)%prim;

        x=(x*x)%prim;
        p>>=1;
    }

    return res;
}

int main(){
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d",&T);

    sieve();
    int i,cnt,sum,pt; LL N;
    while (T--){
        scanf("%lld",&N);
        if (N==1){
            printf("1 1\n");
            continue;
        }

        cnt=sum=1;
        for (i=1; i<=K && N!=1; i++)
            if (N%p[i]==0){
                pt=0;
                while (N%p[i]==0) N/=p[i],pt++;

                cnt*=(pt+1);
                sum=(sum*(fpow(p[i]%prim,pt+1)-1))%prim;
                sum=(sum*fpow((p[i]-1)%prim,prim-2))%prim;
            }

        if (N!=1){
            cnt*=2;
            sum=(1LL*sum*(N+1))%prim;
        }

        printf("%d %d\n",cnt,sum);
    }

    return 0;
}