Pagini recente » Cod sursa (job #917372) | Cod sursa (job #2589488) | Cod sursa (job #2112014) | Cod sursa (job #1544971) | Cod sursa (job #2308398)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("pavare2.in");
ofstream fout("pavare2.out");
int N,n,m,a[101][101][101],b[101][101][101],i,j,k[101],s[101];
bool ok;
char aux[101];
void tipar(int n){
for(int i=1;i<=n;i++)
fout<<ok;
}
void suma(int a[], int b[], int c[]){
int i,t=0;
for(i=1;i<=a[0] || i<=b[0];i++){
c[i]=a[i]+b[i]+t;
t=c[i]/10;
c[i]%=10;
}
c[0]=i-1;
if(t)
c[++c[0]]=t;
}
void dif(int a[], int b[]){
int i,t=0,d;
for(i=b[0]+1;i<=a[0];i++)
b[i]=0;
for(i=1;i<=a[0];i++){
d=a[i]-b[i]-t;
if(d<0){
d=d+10;
t=1;
}
else
t=0;
a[i]=d;
}
while(!a[a[0]])
a[0]--;
}
int cmp(int a[],int b[]){
for(int i=0;i<=a[0];i++)
if(a[i]<b[i])
return -1;
else if(a[i]>b[i])
return 1;
return 0;
}
void cpy(int a[],int b[]){
for(int i=0;i<=b[0];i++)
a[i]=b[i];
}
int main()
{
fin>>N>>n>>m;
fin.get();
fin>>aux+1;
k[0]=strlen(aux+1);
for(i=1;i<=k[0];i++)
k[k[0]-i+1]=aux[i]-'0';
a[0][0][0]=a[0][0][1]=b[0][0][0]=b[0][0][1]=1;
for(i=1;i<=N;i++){
for(j=1;j<=n && j<=i;j++){
cpy(a[i][j],b[i-j][0]);
suma(a[i][0],a[i][j],a[i][0]);
}
for(j=1;j<=m && j<=i;j++){
cpy(b[i][j],a[i-j][0]);
suma(b[i][0],b[i][j],b[i][0]);
}
}
suma(a[N][0],b[N][0],s);
for(i=s[0];i>=1;i--)
fout<<s[i];
fout<<'\n';
i=N;
while(i){
if(!ok){
int x = cmp(a[i][0],k);
if(x<0){
dif(k,a[i][0]);
ok=1;
}
else{
for(j=min(i,n);j>=1;j--){
int x = cmp(a[i][j],k);
if(x<0)
dif(k,a[i][j]);
else{
tipar(j);
i-=j;
ok=1;
break;
}
}
}
}
else{
int x = cmp(b[i][0],k);
if(x<0){
dif(k,b[i][0]);
ok=0;
}
else{
for(j=1;j<=m;j++){
int x = cmp(b[i][j],k);
if(x<0)
dif(k,b[i][j]);
else{
tipar(j);
i-=j;
ok=0;
break;
}
}
}
}
}
return 0;
}