Cod sursa(job #169129)

Utilizator raducu87Radu Andritoiu raducu87 Data 1 aprilie 2008 11:11:30
Problema Sandokan Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <iostream.h>
#include <fstream.h>
#include <math.h>



int main()

{
 fstream f1("sandokan.in",ios::in);
 fstream f2("sandokan.out",ios::out);
 int n,k,rest,i,max,min,x,d;
 int prime[5005];
 long val,kfc,nfc,restfc;
 
 
 f1 >> n;
 f1 >> k;
 
 val=0;
 min=n%(k-1);
 if (min==0) min=k-1;
 min--; n--;
 if (min>(n-min)) min=n-min;
 max=n-min;
 //cout << min <<" "<< max <<" "<< n;
 //getchar();
 
 for (i=2;i<=5000;i++) prime[i]=0;
 
 //for (i=2; i<=1000; i++) if (prime[i]!=0) cout << i <<" la puterea "<<prime[i]<<"\n"; getchar();
 
 for (i=max+1;i<=n;i++) {
                         x=i;
                         d=1;
                         while (x>1) {
                                      d++;
                                      while (x%d==0) {
                                                      prime[d]++;
                                                      x=x/d;
                                                     }
                                     }
                        }
 
 for (i=1;i<=min;i++) {
                         x=i;
                         d=1;
                         while (x>1) {
                                      d++;
                                      while (x%d==0) {
                                                      prime[d]--;
                                                      x=x/d;
                                                     }
                                     }
                        }
// for (i=2; i<=1000; i++) if (prime[i]!=0) cout << i <<" la puterea "<<prime[i]<<"\n"; getchar();
 val=1;
 for (i=5000;i>=2;i--)
     if (prime[i]!=0)
        for (k=1;k<=prime[i];k++)
            val=val*i%2000003;                       
                        
 //cout << val;
 //getchar();
 
 
 /*
 //varianta veche
 val=0;
 rest=n%(k-1);
 if (rest==0) rest=k-1;
 rest--;
 n--;
 k=n-rest;
 kfc=1;
 nfc=1;
 restfc=1;
 
 
 for (i=1;i<=rest;i++) restfc=restfc*i%2000003; 
 for (i=1;i<=k;i++) kfc=kfc*i%2000003;
 nfc=kfc;
 for (i=k+1;i<=n;i++) nfc=nfc*i%2000003;
 
 val=(nfc/kfc)/restfc%2000003;

 cout << n <<" "<< nfc <<"\n"<< rest <<" "<< restfc <<"\n"<< k <<" "<< kfc <<"\n"<< val;
 getchar(); 
 */
 
 f2 << val;
 f1.close();
 f2.close();
 
 return 0;
}