augustine98
1/15/2020 - 7:52 PM

codathon3.cpp


#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int MAX1 =10;
const int MAX2 = 1e5;
const ll MOD = 1e9 + 7;
vector<pair<int, ll> > items;
ll n, m, l;
ll dp[MAX1 +1][MAX2 +1][MAX1 + 1];

ll nCr(ll n, ll k )
{
    if(k == 0 || k == n)
        return 1LL;
    return (nCr(n-1, k-1) + nCr(n -1, k))%MOD;
}
ll count(ll idx , ll rem , ll cost)
{
    if(idx == l)
        return ( (rem==0) && ((cost%m) ==0));
    if(rem == 0)
        return ( cost%m == 0);

    if(dp[idx][rem][cost%m] != -1)
        return dp[idx][rem][cost%m];
    ll ans = 0;
    
    for(ll j = 0; j<= rem; j++)
    {
        ans += (count(idx +1 , rem -j, (cost%m + (j *items[idx].first)%m)%m));
    }
    return dp[idx][rem][cost%m] = ans;
}
int main()
{
    cin>>n>>m>>l;
    map<int , ll> m;
    for(int i = 0; i<l ; i++)
    {
        int v;
        cin>>v;
        m[v]++;
    }
    memset(dp, -1, sizeof(dp));
    cout<<count(0LL, (ll)n, 0LL)<<"\n";
    
    
}