Cod sursa(job #2324732)

Utilizator Definitely_Not_Albert_GreacaCuSigurantaNuAlbert Definitely_Not_Albert_Greaca Data 21 ianuarie 2019 14:31:14
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
//#include <iostream>
#include <fstream>
using namespace std;
typedef int Huge[500];
void AtribHuge(Huge H, Huge X) {
  int i;
  for (i = 0; i <= X[0]; ++i) {
    H[i] = X[i];
  }
}
void Add(Huge A, Huge B)
{ int i,T=0;

  if (B[0]>A[0])
    { for (i=A[0]+1;i<=B[0];) A[i++]=0;
      A[0]=B[0];
    }
    else for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    { A[i]+=B[i]+T;
      T=A[i]/10;
      A[i]%=10;
    }
  if (T) A[++A[0]]=T;
}
void AtribValue(Huge H, unsigned long X) {
  H[0] = 0;
  while (X) {
      ++H[0];
      H[H[0]] = X % 10;
      X /= 10;
  }
}
void Subtract(Huge A, Huge B)
{ int i, T=0;
  for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
  while (!A[A[0]]) A[0]--;
}
void MultHuge(Huge A, Huge B, Huge C)
{ int i,j,T=0;

  C[0]=A[0]+B[0]-1;
  for (i=1;i<=A[0]+B[0];) C[i++]=0;
  for (i=1;i<=A[0];i++)
    for (j=1;j<=B[0];j++)
      C[i+j-1]+=A[i]*B[j];
  for (i=1;i<=C[0];i++)
    { T=(C[i]+=T)/10;
      C[i]%=10;
    }
  if (T) C[++C[0]]=T;
}
void Mult(Huge H, unsigned long X)
{ int i;
  unsigned long T=0;

  for (i=1;i<=H[0];i++)
    { H[i]=H[i]*X+T;
      T=H[i]/10;
      H[i]=H[i]%10;
    }
  while (T)
    { H[++H[0]]=T%10;
      T/=10;
    }
}

///-------------
int n,b,p,q;
Huge f[30];
void bct(int poz,int maxi,int lung,Huge pos){
    Huge y;
    if(poz==n+1){
        Add(f[maxi],pos);
        return;
    }
    bct(poz+1,max(maxi,lung+1),lung+1,pos);
    Huge z;
    AtribHuge(z,pos);
    Mult(pos,(b-1));
    bct(poz+1,maxi,0,pos);
    AtribHuge(pos,z);
}
int main()
{
    ifstream cin("zero.in");
    ofstream cout("zero.out");
    Huge sum;
    cin>>n>>b>>p>>q;
    Huge x;
    AtribValue(x,b-1);
    AtribValue(sum,0);
    bct(2,0,0,x);
    for(int i=0;i<=p;i++)
        Add(sum,f[i]);
    for(int i=sum[0];i>=1;i--)
        cout<<sum[i];
    cout<<"\n";
    AtribValue(sum,0);
    for(int i=q;i<=n;i++)
        Add(sum,f[i]);

    for(int i=sum[0];i>=1;i--)
        cout<<sum[i];
    return 0;
}