Cod sursa(job #3332048)

Utilizator vladinfo_Grecu Vlad vladinfo_ Data 3 ianuarie 2026 14:26:03
Problema Cowfood Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>
/// Template Dutzu
#define fast ios_base::sync_with_stdio(false);cin.tie(0);
#define MOD 3210121
using namespace std;

ifstream fin("cowfood.in.in");
ofstream fout("cowfood.in.out");
int v[21][31];
int f[301];
bool used[31];
int total;
int k,s;
long long inv(int a, int m)
{
    long long yn;
    long long x=1,y=0;
    while (a)
    {
        yn=x-m/a*y;
        x=y;
        y=yn;
        long long r=m%a;
        m=a;
        a=r;
    }
    return y%MOD;
}
int expo(int a, int n)
{
    int p=1;
    while (n)
    {
        if (n%2)
            p=(1LL*p*a)%MOD;
        a=(1LL*a*a)%MOD;
        n/=2;
    }
    return p;
}
int comb(int n, int k)
{
    long long dem;
    dem=f[n];
    long long imp;
    imp=(1LL*f[k]*f[n-k])%MOD;
    imp=expo(imp,MOD-2);
    return (1LL*dem*imp)%MOD;
}
int maxim[31];
int A[31];
void bkt(int vf, int& rez, int n)
{
    if (vf>n)
    {
        int cnt=0;
        long long suma=0;
        memset(A,0,sizeof(A));
        for (int i=1;i<=n;i++)
            if (used[i]==1)
                {
                    cnt++;
                    for (int j=1;j<=n;j++)
                        A[j]=max(A[j],v[i][j]);
                }
           for (int j=1;j<=n;j++)
                suma+=A[j];

        if (!cnt)
            return;
        if (cnt%2)
            rez=(rez+comb(suma+k,k))%MOD;
        else
            rez=(rez-comb(suma+k,k)+MOD)%MOD;
        return;
    }
    bkt(vf+1,rez,n);
    used[vf]=1;
    bkt(vf+1,rez,n);
    used[vf]=0;
}
int main()
{
    fast
    int n;
    fin>>k>>s>>n;
    f[1]=1;
    for (int i=2;i<=300;i++)
        f[i]=(1LL*f[i-1]*i)%MOD;
    total=comb(s-1,k);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=k;j++)
                fin>>v[i][j];
    int rez=0;
    bkt(1,rez,n);
    fout<<total-rez;
    return 0;
}