Pagini recente » Cod sursa (job #2605069) | Cod sursa (job #3032219) | Cod sursa (job #2791782) | Cod sursa (job #1399873) | Cod sursa (job #1910368)
#include <bits/stdc++.h>
#define maxN 105
#define maxCif 35
using namespace std;
string str;
int dp[maxN][maxN][2][maxCif]; /* total tiles, consec of color,color */
int n,a,b,i,j,x,cnt,last,k[maxCif],sol[maxCif];
void add(int a[],int b[]) /* bignum addition */
{
int t=0,i;
for(i=1;i<=a[0] || i<=b[0] || t;i++,t/=10)
a[i]=(t+=a[i]+b[i])%10;
a[0]=i-1;
}
void sub(int a[],int b[]) /* bignum subtraction */
{
int i,t=0;
for(i=1;i<=a[0];i++)
{
a[i]-=((i<=b[0])?b[i]:0)+t;
a[i]+=(t=(a[i]<0)*10);
}
while(!a[a[0]])
a[a[0]--]=0;
}
bool cmp(int a[],int b[]) /* bignum compare */
{
if(a[0]!=b[0])
return a[0]>b[0];
for(int i=a[0];i>=1;i--)
if(a[i]!=b[i])
return a[i]>b[i];
return false;
}
int main()
{
ifstream f("pavare2.in");
ofstream g("pavare2.out");
f>>n>>a>>b;
f>>str;
k[0]=str.length();
for(i=0;i<(int)str.length();i++)
k[str.length()-i]=str[i]-'0';
dp[1][1][0][0]=dp[1][1][0][1]=1; /* initial states */
dp[1][1][1][0]=dp[1][1][1][1]=1;
for(i=2;i<=n;i++) /* building dp */
{
for(j=1;j<=a;j++)
add(dp[i][1][1],dp[i-1][j][0]),
add(dp[i][j][0],dp[i-1][j-1][0]);
for(j=1;j<=b;j++)
add(dp[i][1][0],dp[i-1][j][1]),
add(dp[i][j][1],dp[i-1][j-1][1]);
}
for(i=1;i<=n;i++) /* summing */
{
for(j=2;j<=a;j++)
add(dp[i][j][0],dp[i][j-1][0]);
for(j=2;j<=b;j++)
add(dp[i][j][1],dp[i][j-1][1]);
}
add(sol,dp[n][a][0]);
add(sol,dp[n][b][1]);
for(i=sol[0];i>=1;i--)
g<<sol[i];
g<<'\n';
if(cmp(k,dp[n][a][0])==false)
{g<<0;last=0;cnt=1;}
else
{sub(k,dp[n][a][0]);g<<1;last=1;cnt=1;}
for(i=n-1;i>=1;i--) /* hate this part.. */
{
if(last==0 && cnt==a)
{g<<1;last=1;cnt=1;continue;}
if(last==1 && cnt==b)
{g<<0;last=0;cnt=1;continue;}
if(last==0)
{
if(cmp(k,dp[i][a-cnt][0])==false)
{g<<0;cnt++;}
else{
sub(k,dp[i][a-cnt][0]);
g<<1;
last=1;cnt=1;
}
}
else
{
if(cmp(k,dp[i][a][0])==false)
{g<<0;last=0;cnt=1;}
else{
sub(k,dp[i][a][0]);
g<<1;
cnt++;
}
}
}
return 0;
}