Cod sursa(job #1487578)

Utilizator DeltaMTP Dragos DeltaM Data 17 septembrie 2015 00:46:58
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<cstdio>
#include<bitset>
#define MOD 9973
using namespace std;
bitset<1001000>c;
long long n,x,y,s1,s2,p,v[1001000];
int t,i,a,j,nr;
FILE *f,*g;
void cmmdc(long long n,long long a,long long &x,long long &y){
    if(a==0){
        x=1;
        y=0;
        return;
    }
    long long xa,ya;
    cmmdc(a,n%a,xa,ya);
    x=ya;
    y=xa-(n/a)*ya;
}
int main(){
    f=fopen("ssnd.in","r");
    g=fopen("ssnd.out","w");
    c[1]=1;
    for(i=2;i<=1000000;i++){
        if(c[i]==0){
            v[++nr]=i;
            for(j=i+i;j<=1000000;j+=i){
                c[j]=1;
            }
        }
    }
    fscanf(f,"%d",&t);
    while(t--){
        s1=s2=1;
        fscanf(f,"%lld",&n);
        for(i=1;i<=nr&&v[i]*v[i]<=n;i++){
            a=0;
            p=1;
            while(n%v[i]==0){
                a++;
                p=(p*v[i])%MOD;
                n/=v[i];
            }
            if(p>1){
                p=(p*v[i])%MOD-1;
                if(p<0)
                    p+=MOD;
                cmmdc(MOD,v[i]-1,x,y);
                if(y<0)
                     y=(y+((-y)/MOD+1)*MOD)%MOD;
                s2=(s2*y*p)%MOD;
            }
            s1*=a+1;
        }
        if(n>1){
            s1*=2;
            p=n;
            n=(n*n)%MOD-1;
            if(n<0)
                n+=MOD;
            cmmdc(MOD,p-1,x,y);
            if(y<0)
                 y=(y+((-y)/MOD+1)*MOD)%MOD;
            s2=(s2*y*n)%MOD;
        }
        fprintf(g,"%lld %lld\n",s1,s2);
    }




    fclose(f);
    fclose(g);
    return 0;
}