Cod sursa(job #1162272)

Utilizator hevelebalazshevele balazs hevelebalazs Data 31 martie 2014 19:01:29
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
#define fr(i,a,b) for(i=a;i<b;++i)
#define N 1000010
#define M 9973
char p[N];
int P[N],PN;

int x,y,x1;
int gcd(int a,int b){
    if(!b){x=1,y=0;return a;}
    int d=gcd(b,a%b);
    x1=x,x=y,y=x1-y*(a/b);
    return d;
    }
int modinv(int a,int b){
    int d=gcd(a,b);
    while(x<0)x+=b;
    while(x>=b)x-=b;
    return x;
    }

int main(){
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    int i,j,m,t;
    long long n;
    fr(i,2,N) if(!p[i])for(j=i<<1;j<N;j+=i)p[j]=1;
    fr(i,2,N)if(!p[i])P[PN++]=i;
    int nr,sum;
    scanf("%i",&t);
    while(t--){
        scanf("%lli",&n);
        nr=sum=1,i=0,j=0;
        while(n>1){
            j=0;
            m=P[i]%M;
            while(!(n%P[i])){
                m*=P[i]%M;
                m%=M;
                ++j;
                n/=P[i];
                }
            if(j) sum*=--m*modinv(P[i]-1,M);
            sum%=M;
            nr*=++j;
            nr%=M;
            ++i;
            }
        while(nr<0)nr+=M;
        while(nr>=M)nr-=M;
        while(sum<0)sum+=M;
        while(sum>=M)sum-=M;
        printf("%i %i\n",nr,sum);
        }
    return 0;
    }