Cod sursa(job #2489258)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 8 noiembrie 2019 10:21:19
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.26 kb
#include<fstream>
#include<cstring>
#define dim 100000
using namespace std;
ifstream fin("resturi.in");
ofstream fout("resturi.out");
int rez[dim],k[dim],aux[dim],r[dim],N[dim],sol[dim];
int m[32][dim],x[32][dim];
int res,p,t,z,i,a[32],n[32];
void atrib(int A[],int B[])
{
    for(int i=B[0]+1;i<=A[0];i++) A[i]=0;
    for(int i=0;i<=B[0];i++) A[i]=B[i];
}
void Subtract(int A[], int 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]>1) A[0]--;
}
void imp(int A[], unsigned long X)
{
    int i,R=0;
    for(i=A[0];i;i--) A[i]=(R=10*R+A[i])/X,R%=X;
    while(!A[A[0]]&&A[0]>1) A[0]--;
}
void inm(int H[], unsigned long X)
{
    int i,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;
}
void Shl(int H[], int Count)
{
  memmove(&H[Count+1],&H[1],sizeof(int)*H[0]);
  memset(&H[1],0,sizeof(int)*Count);
  H[0]+=Count;
}
int Sgn(int H1[], int H2[])
{
    while(H1[0]&&!H1[H1[0]]) H1[0]--;
    while(H2[0]&&!H2[H2[0]]) H2[0]--;
    if(H1[0]<H2[0])return -1;
        else if(H1[0]>H2[0]) return 1;
  for(int i=H1[0];i>0;--i)
    if(H1[i]<H2[i]) return -1;
    else if(H1[i]>H2[i]) return 1;
  return 0;
}
void Minm(int A[], int B[], int C[])
{
    int i,j,T=0;
    C[0]=A[0]+B[0]-1;
    for(i=1;i<=C[0];i++) 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 Mimp(int A[], int B[], int C[], int R[])
{
    int i;
    R[0]=0;C[0]=A[0];
    for(i=A[0];i;i--)
    {
        Shl(R,1);R[1]=A[i];
        C[i]=0;
        while(Sgn(B,R)!=1)
        {
            C[i]++;
            Subtract(R,B);
        }
    }
    while(!C[C[0]]&&C[0]>1) C[0]--;
}
void rid(int A[],int B[])
{
    while(!(B[0]==1&&B[1]==1))
    {
        if(B[1]%2==0)
        {
            Minm(rez,A,k);
            Mimp(k,N,rez,r);
            atrib(rez,r);
        }
        Minm(A,A,k);
        Mimp(A,N,k,r);
        atrib(A,r);
    }
    Minm(rez,A,k);
    atrib(A,k);
}
void Add(int A[], int 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;
}
int main()
{
    fin>>t;
    for(;t--;)
    {
        fin>>z;memset(N,0,sizeof(N));
        N[0]=1;N[1]=1;
        for(i=1;i<=z;i++)
        {
            fin>>n[i]>>a[i];
            inm(N,n[i]);
        }
        for(i=1;i<=z;i++)
        {
            imp(m[i],n[i]);res=0,p=1;
            atrib(x[i],m[i]);atrib(aux,N);
            while(!res)
            {
                aux[p]-=res;res=0;
                if(aux[p]<0) aux[p]+=10,res=1;
                p++;
            }
            while(aux[aux[0]]==0) aux[0]--;
            rid(x[i],aux);
            Minm(m[i],x[i],k);atrib(m[i],k);
            inm(m[i],a[i]);
            Add(sol,m[i]);
            Mimp(sol,N,aux,r);
            atrib(sol,r);
        }
        for(i=sol[0];i;i--) fout<<sol[i];
    }
    return 0;
}