Cod sursa(job #1628718)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 4 martie 2016 10:16:20
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<cstdio>
#include<bitset>
#define MOD 9973
using namespace std;
bitset<1001000>w;
long long t,nr,n,i,j,a,b,x,y,ss,sn,p,v[1001000];
FILE *f,*g;
void cmmdc(long long a,long long b,long long &x,long long &y){
    if( b == 0 ){
        x=1;
        y=0;
        return;
    }
    long long xa,ya;
    cmmdc( b, a % b, xa, ya );
    x = ya;
    y = xa - ( a / b ) * ya;
    return;
}
int main(){
    f=fopen("ssnd.in","r");
    g=fopen("ssnd.out","w");
    w[1] = 0;
    for(i=2; i<=1000000; i++){
        if( !w[i] ){
            v[++nr] = i;
            for(j=i+i; j<=1000000; j+=i){
                w[j] = 0;
            }
        }
    }
    fscanf(f,"%d",&t);
    while(t--){
        fscanf(f,"%lld",&n);
        sn = ss = 1;
        b = n;
        for(i=1; i<= n && v[i] <= n / v[i]; i++){
            a = 0;
            p = 1;
            while( n % v[i] == 0 ){
                a ++;
                n /= v[i];
                p = ( p * v[i] ) % MOD;
            }
            sn *= ( a + 1 );
            if( p != 1 ){
                p = ( p * v[i] ) % MOD - 1;
                if( p < 0 )
                    p += MOD;
                x = y = 0;
                cmmdc( MOD, v[i] - 1, x, y );
                if( y < 0 )
                    y = ( y + ( ( - y ) / MOD + 1) * MOD ) % MOD;
                ss = ( ss * y * p ) % MOD;
            }
        }
        if( n > 1 ){
            sn *= 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;
            ss = ( ss * y * n ) % MOD;
        }
        fprintf(g,"%lld %lld\n",sn,ss);
    }
    fclose(f);
    fclose(g);
    return 0;
}