Pagini recente » Cod sursa (job #377083) | Cod sursa (job #2850081) | Cod sursa (job #1993781) | Cod sursa (job #2575703) | Cod sursa (job #2307354)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("pavare2.in");
ofstream g("pavare2.out");
int a[101][101][101],b[101][101][101],v[101];
int n,A,B,i,j,l,x,ok;
char S[102];
void dif(int a[],int b[],int c[]){
int i=0,t=0;
for(i=1;i<=a[0]||i<=b[0];i++){
c[i]=a[i]-b[i]+t;
if(c[i]<0){
t=-1;
c[i]=10+c[i];
}
}
int j=1;
while(c[j]==0)
j++;
c[0]=max(a[0],b[0])-(j-1);
for(int l=j;l<=c[0];l++)
c[l-j+1]=c[l];
}
void suma(int a[],int b[],int c[]){
int i=0,r=0;
for(i=1;i<=a[0]||i<=b[0];i++){
c[i]=a[i]+b[i]+r;
r=c[i]/10;
c[i]=c[i]%10;
}
c[0]=i-1;
if(r!=0){
c[0]=i;
c[i]=r;
}
}
int comp(int a[],int b[]){
int i=0;
for(i=max(a[0],b[0]);i>=1;i--)
if(a[i]>b[i])
return 1;
else if(a[i]<b[i])
return -1;
return 0;
}
int main()
{ f>>n>>A>>B;
a[0][0][1]=a[0][0][0]=1;
b[0][0][1]=b[0][0][0]=1;
for(i=1;i<=n;i++){
for(j=1;j<=A&&j<=i;j++){
a[i][j][0]=b[i-j][0][0];
for(l=1;l<=b[i-j][0][0];l++)
a[i][j][l]=b[i-j][0][l];
suma(a[i][0],a[i][j],a[i][0]);
}
for(j=1;j<=B&&j<=i;j++){
b[i][j][0]=a[i-j][0][0];
for(l=1;l<=b[i-j][0][0];l++)
b[i][j][l]=a[i-j][0][l];
suma(b[i][0],b[i][j],b[i][0]);
}
}
suma(a[n][0],b[n][0],v);
for(i=v[0];i>=1;i--)
g<<v[i];
g<<'\n';
f>>S+1;
memset(v,0,sizeof(v));
v[0]=strlen(S+1);
for(i=1;i<=v[0];i++)
v[i]=S[i]-'0';
x=n;ok=0;
while(x!=0){
if(ok==0){
if(comp(v,a[x][0])==1){
//k-=a[x][0];
dif(v,a[x][0],v);
ok=1;
}
else{
j=x;
while(comp(a[x][j],v)==-1&&j>1){
//k-=a[x][j];
dif(v,a[x][j],v);
j--;
}
ok=1;
x=x-j;
for(l=1;l<=j;l++)
g<<0;
}
}
else{
if(comp(b[x][0],v)==-1){
//k-=b[x][0];
dif(v,b[x][0],v);
ok=0;
}
else{
j=1;
while(comp(b[x][j],v)==-1&&j<n){
//k-=b[x][j];
dif(v,b[x][j],v);
j++;
}
ok=0;
x=x-j;
for(l=1;l<=j;l++)
g<<1;
}
}
}
return 0;
}