Cod sursa(job #1404524)

Utilizator zhm248Mustatea Radu zhm248 Data 28 martie 2015 12:27:28
Problema Buline Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,v[25],f[15],v1[25];
unsigned long long s=0;
unsigned long long factorial(int x)
{
    unsigned long long val=1;
    for(int i=2;i<=x;++i)
    {
        val*=(unsigned long long)i;
    }
    return val;
}

unsigned long long putere(int a,int b)
{
    unsigned long long val=1;
    for(int i=1;i<=b;++i)
    {
        val*=(unsigned long long)a;
    }
    return val;
}

void bkt(int x)
{
    if(x==n+1)
    {
        int sum=0;
        for(int i=1;i<=n;++i)
        {
            sum+=v[i];
        }
        if(sum%2==0)
        {
            int ok=0;
            for(int i=1;i<=n;++i)
            {
                v1[i]=v1[i-1]+v[i];
            }
            for(int i=1;i<=n;++i)
            {
                for(int j=0;j<i;++j)
                {
                    if(v1[i]-v1[j]==sum/2)
                    {
                        ok=1;
                        break;
                    }
                }
                if(ok==1)
                    break;
            }
            if(ok==1)
            {
                memset(f,0,sizeof(f));
                for(int i=1;i<=n;++i)
                {
                    f[v[i]]++;
                }
                unsigned long long p=1;
                for(int i=0;i<=9;++i)
                {
                    p*=factorial(f[i]);
                }
                s+=(factorial(n)/p);
            }
        }
    }
    else
    {
        if(x<=n)
        {
        for(int i=v[x-1];i<=k;++i)
        {
            v[x]=i;
            bkt(x+1);
        }
        }
    }
}

int main()
{
    freopen("ghinion.in","r",stdin);
    freopen("ghinion.out","w",stdout);
    scanf("%d%d",&n,&k);
    bkt(1);
    unsigned long long x=putere(k+1,n);
    printf("%llu\n",x-s);
    return 0;
}