Cod sursa(job #1631574)

Utilizator avaspAva Spataru avasp Data 5 martie 2016 17:07:20
Problema Diamant Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
using namespace std;
int n,m,x,v[401],cate,g[88206],s2,cg[88206],ccg[88206];


int main(){
    freopen("diamant.in","r",stdin);
    freopen("diamant.out","w",stdout);
    scanf("%d%d%d",&n,&m,&x);
    int MM;
    if(n!=1&&m!=1)
        MM=(n*m*(m+1)*(n+1)/4);
    if(n==1&&m==1)
        MM=1;
    if(n==1&&m!=1)
        MM=(m*(m+1))/2;
    if(m==1&&n!=1)
        MM=(n*(n+1))/2;
    if(x>MM)
        printf("0");
    else
    if(x<(-1)*MM)
        printf("0");
    else{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            v[++cate]=i*j;
    for(int i=1;i<=cate;i++){

        for(int s=88200;s>=0;s--){
            if(g[s]!=0&&s+v[i]<=88200){
                g[s+v[i]]+=g[s];
                if(g[s+v[i]]>10000)
                    g[s+v[i]]-=10000;
            }
            s2=88200-s;
            if(cg[s2]!=0&&s2-v[i]>=0){
                cg[s2-v[i]]+=cg[s2];
                if(cg[s2-v[i]]>10000)
                    cg[s2-v[i]]-=10000;
            }
        }
        g[44100+v[i]]++;
        cg[44100-v[i]]++;
        for(int s=0;s<=88200;s++){
            g[s]+=(cg[s]-ccg[s]);
            if(g[s]<0)
                g[s]+=10000;
            if(g[s]>10000)
                g[s]-=10000;
            cg[s]=g[s];
            ccg[s]=g[s];
        }
    }
    g[44100]++;
    printf("%d",g[44100+x]);
    }
    return 0;
}