Cod sursa(job #129456)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 29 ianuarie 2008 15:32:51
Problema Suma divizorilor Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.21 kb
 #include <stdio.h>  
   
 const int revs[9901];  
   
 #define PROD(a, b)  ((int) (((long) (a) * (b)) % 9901))  
   
 int pow_mod(int q, long n)  
 {  
     int tmp;  
   
     if(!n)  
         return(1);  
     tmp = pow_mod(q, n >> 1);  
     tmp = PROD(tmp, tmp);  
     return((n & 1) ? PROD(tmp, q) : tmp);  
 }  
   
 int calc_prog(int q, long n)  
 {  
     // ATTN: q = 1, esp. n > 9901  
     if(q == 1)  
         return((int) ((n + 1) % 9901));  
     return(PROD(pow_mod(q, n + 1) + 9900, revs[q ? q - 1 : 9900]));  
 }  
   
 int main()  
 {  
     long a, b;  
     int res, i, cnt;  
   
     fscanf(fopen("sumdiv.in", "r"), "%ld%ld", &a, &b);  
   
     // ATTN: (2**k)*N  
     for(cnt = 0; !((int) a & 1); a >>= 1, cnt++) ;  
     res = calc_prog(2, cnt * b);  
   
     for(i = 3; (long) i * i <= a; i += 2) {  
         if(a % i)  
             continue;  
         for(cnt = 1; !((a /= i) % i); cnt++) ;  
         res = PROD(res, calc_prog(i % 9901, cnt * b));  
     }  
   
     // ATTN: large primes  
     if(a > 1)  
         res = PROD(res, calc_prog((int) (a % 9901), b));  
   
     fprintf(fopen("sumdiv.out", "w"), "%d\n", res);  
     return(0);  
 }