Cod sursa(job #1209704)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 18 iulie 2014 13:03:11
Problema Diamant Scor 30
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 1.17 kb
#include<fstream>
using namespace std;
typedef struct { int val, nr; } tip;
tip a[200];
int i,j,n,m,k,s,v[405],dp[2][100000],nr,zero=50000,indc=1,indp,comb[10][10];

int main(void) {
    ifstream fin("diamant.in");
    ofstream fout("diamant.out");
    
    fin>>n>>m>>k;
    
    if (k<0) k*=-1;
    
    comb[0][0]=1;
    for (i=1; i<10; ++i){
        comb[i][0]=1;
        for (j=1; j<=i; ++j) comb[i][j]=comb[i-1][j]+comb[i-1][j-1];
        }
    
    for (i=1; i<=n; ++i)
     for (j=1; j<=m; ++j){
      s+=i*j;
      ++v[i*j];
      }
    
    if (k>s) { fout<<"0"; return 0; }
    
    for (i=1; i<=n*m; ++i) 
     if (v[i]>0) { ++nr; a[nr].val=i; a[nr].nr=v[i]; }
     
    dp[0][zero]=1; dp[0][zero-1]=1; dp[0][zero+1]=1;
    
    for (i=2; i<=nr; ++i) {
        
     for (j=zero-s; j<=zero+s; ++j){
          int i1,j1;
          for (i1=0; i1<=a[i].nr; ++i1)
           for (j1=0; j1<=i1; ++j1){
            dp[indc][j]+=dp[indp][j-(i1-2*j1)*a[i].val]*comb[a[i].nr][i1];
            dp[indc][j]%=10000;
            }
         
         }
     
     swap(indc,indp);
     
     }
    
    fout<<dp[indp][zero+k];
    
    return 0;
}