Pagini recente » Cod sursa (job #36328) | Cod sursa (job #1339278) | Cod sursa (job #353815) | Cod sursa (job #2714501) | Cod sursa (job #848096)
Cod sursa(job #848096)
#include <fstream>
using namespace std;
ifstream F("cowfood.in");
ofstream G("cowfood.out");
const int Mod = 3210121;
const int Kmax = 35;
const int Smax = 10010;
const int Nmax = 25;
int K,S,N,Sol,Sum;
int CR[Kmax][Smax]; // combinari cu repetitie
int A[Nmax][Kmax],Stats[Kmax];
void Back(int Step,int Sign,int Stats[]) // O(2^N * K)
{
if ( Step == N+1 )
{
Sum = S; for (int i=1;i<=K;++i) Sum -= Stats[i];
if ( Sum >= 0 ) Sol = ( Sol + Sign * CR[K][Sum] + Mod ) % Mod;
return;
}
Back(Step+1,Sign,Stats);
int Next_Stats[Kmax];
for (int i=1;i<=K;++i) Next_Stats[i] = max(Stats[i],A[Step][i]);
Back(Step+1,-Sign,Next_Stats);
}
int main()
{
F>>K>>S>>N;
for (int i=1;i<=N;++i)
for (int j=1;j<=K;++j)
F>>A[i][j];
for (int i=0;i<=S+1;++i)
CR[0][i]=1;
for (int i=1;i<=K+1;++i)
for (int j=0;j<=S+1;++j)
CR[i][j]=( CR[i-1][j] + ( j == 0 ? 0 : CR[i][j-1] ) ) % Mod;
Sol =(Mod-S*K-1) % Mod;
Back(1,1,Stats);
G<<Sol<<'\n';
F.close();
G.close();
return 0;
}