Cod sursa(job #1889891)

Utilizator UrsuDanUrsu Dan UrsuDan Data 22 februarie 2017 22:04:00
Problema Diamant Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#define mod 10000

using namespace std;

int sume1 [201010];
int sume2 [201010];
int sume3 [201010];

#define sume1 (sume1 + 100000)
#define sume2 (sume2 + 100000)
#define sume3 (sume2 + 100000)

int v[500];

int main()
{
    freopen("diamant.in","r",stdin);
    freopen("diamant.out","w",stdout);
    int n,m,x,i,j,k=0,maxi=0,mini=0,sum;
    scanf("%d%d%d",&n,&m,&x);
    if(n*(n+1)*m*(m+1)<4*x)
    {
        printf("0");
        return 0;
    }
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            k++;
            v[k]=i*j;
        }
    }
    for(i=1; i<=k; i++)
    {

        maxi+=v[i];
        mini-=v[i];
        for(j=maxi; j>=mini; j--)
            sume1[j+v[i]]+=sume1[j];
        for(j=mini; j<=maxi; j++)
            sume2[j-v[i]]+=sume2[j];
        for(j=mini; j<=maxi; j++)
        {
            sum=sume1[j]+sume2[j]-sume3[j];
            sum%=mod;
            sume1[j]=sum;
            sume2[j]=sum;
            sume3[j]=sum;
        }
        sume1[v[i]]++;
        sume1[-v[i]]++;
        sume2[v[i]]++;
        sume2[-v[i]]++;
        sume3[v[i]]++;
        sume3[-v[i]]++;
    }
    printf("%d",sume1[x]%mod);
    return 0;
}