Cod sursa(job #1659869)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 22 martie 2016 17:52:31
Problema Diamant Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<cstdio>
const int V=44100;
const int MOD=10000;
const int N=20;
int ki[2*V+N];
int k1[2*V+N];
int k2[2*V+N];
int ob[N*N*2+N];
int n,m,x;
void upd(int&x){
    if(x>MOD)
        x-=MOD;
}
int modul(int x){
    if(x<0)
        return -x;
    return x;
}
int main(){
    freopen("diamant.in","r",stdin);
    freopen("diamant.out","w",stdout);
    scanf("%d%d%d",&n,&m,&x);
    if(modul(x)>V){
        printf("0");
        return 0;
    }
    int k=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            ob[++k]=i*j;
    ki[V]=1;
    for(int i=1;i<=k;i++){
        for(int j=0;j<2*V+N;j++){
            k1[j]=ki[j];
            k2[j]=ki[j];
        }
        for(int j=0;j<2*V+N;j++){
            if(j+ob[i]<2*V+N){
                k1[j+ob[i]]+=ki[j];
                upd(k1[j+ob[i]]);
            }
            if(j-ob[i]>=0){
                k2[j-ob[i]]+=ki[j];
                upd(k1[j+ob[i]]);
            }
        }
        for(int j=0;j<2*V+N;j++){
            ki[j]=k1[j]+k2[j]-ki[j];
            upd(ki[j]);
            if(ki[j]<0)
                ki[j]+=MOD;
        }
    }
    printf("%d",ki[V+x]);
    return 0;
}