Advertisement
Patrickmeme

Divizori--oprimizat

Jan 22nd, 2023
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. #define NR_E 1000000
  5. #define M_CIUR 40001
  6. #define NR_PRIME 4300
  7. char v[NR_E],ciur[M_CIUR];
  8. int nrp[NR_PRIME];
  9. int main()
  10. {
  11.     int n,k,cnr,poz,d,cnt,max1,i,aux,nr,cnt1,j,n2,rp,cdnr;
  12.     FILE *fin,*fout;
  13.     fin=fopen("divizori.in","r");
  14.     fscanf(fin,"%d%d",&n,&k);
  15.     for(i=2;i<M_CIUR;i++){
  16.         if(ciur[i]==0){
  17.             for(j=i*i;j<M_CIUR;j+=i)
  18.                 ciur[j]=1;
  19.         }
  20.     }
  21.     n2=0;
  22.     for(i=2;i<M_CIUR;i++){
  23.         if(ciur[i]==0){
  24.             nrp[n2]=i;
  25.             n2++;
  26.         }
  27.     }
  28.     fgetc(fin);
  29.     for(i=0;i<n;i++)
  30.         v[i]=fgetc(fin)-'0';
  31.     fclose(fin);
  32.     for(i=0;i<=n/2;i++){
  33.         aux=v[n-1-i];
  34.         v[n-1-i]=v[i];
  35.         v[i]=aux;
  36.     }
  37.     cnr=999999999;
  38.     max1=0;
  39.     cnt1=0;
  40.     while((n>1)||(v[0]!=2 && v[0]!=1)){
  41.         nr=0;
  42.         if(n-k>=0){
  43.             for(i=n-1;i>=n-k;i--){
  44.                 nr=nr*10+v[i];
  45.                 v[i]=0;
  46.             }
  47.         }else{
  48.             i=n-1;
  49.             while(i>=0){
  50.                 nr=nr*10+v[i];
  51.                 v[i]=0;
  52.                 i--;
  53.  
  54.             }
  55.         }
  56.         d=0;
  57.         cnt=1;
  58.         cdnr=nr;
  59.         while(nr>1){
  60.             rp=0;
  61.             while(nr%nrp[d]==0){
  62.                 nr/=nrp[d];
  63.                 rp++;
  64.             }
  65.             cnt*=(rp+1);
  66.             d++;
  67.             if(nrp[d]*nrp[d]>nr){
  68.                 if(nr!=1)
  69.                     cnt*=2;
  70.                 nr=1;
  71.             }
  72.         }
  73.         if(cnt>max1){
  74.             max1=cnt;
  75.             cnr=cdnr;
  76.         }else if(cnt==max1 && cdnr<cnr){
  77.             cnr=cdnr;
  78.         }
  79.         nr=cnt;
  80.         if(n-k>=0){
  81.             poz=n-k;
  82.             while(nr>0){
  83.                 v[poz]=nr%10;
  84.                 poz++;
  85.                 nr/=10;
  86.             }
  87.             n=n-(k-(poz-(n-k)));
  88.         }else{
  89.             n=0;
  90.             while(nr>0){
  91.                 v[n]=nr%10;
  92.                 n++;
  93.                 nr/=10;
  94.             }
  95.         }
  96.         cnt1++;
  97.     }
  98.     fout=fopen("divizori.out","w");
  99.     fprintf(fout,"%d\n%d\n%d",cnt1+1,max1,cnr);
  100.     fclose(fout);
  101.     return 0;
  102. }
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement