Cod sursa(job #1281484)

Utilizator andrei20003Ionescu Andrei andrei20003 Data 3 decembrie 2014 11:07:15
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<cstdio>
#include<bitset>
#define mod 9973
using namespace std;
long long n,s1,s2,p,x,b,y,v[1001000];
int t,i,j,a,nr;
bitset<1001000>c;
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;j<=1000000;j+=i){
                c[j]=1;
            }
        }
    }
    fscanf(f,"%lld",&t);
    while(t--){
        s1=s2=1;
        fscanf(f,"%lld",&n);
        b=n;
        for(i=1;i<=n&&v[i]*v[i]<=n;i++){
            a=0;
            p=1;
            while(n%v[i]==0){
                a++;
                n/=v[i];
                p=(p*v[i])%mod;
            }
            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;
            x=y=0;
            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;
}