Cod sursa(job #1340487)

Utilizator MaarcellKurt Godel Maarcell Data 11 februarie 2015 20:53:43
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <bitset>
#define prim 9973
#define MAXN 1000000
using namespace std;

int T,K,p[80000]; bool v[MAXN+5];

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,p1,p2; long long N;
    while (T--){
        scanf("%lld",&N);

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

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

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

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

    return 0;
}