Cod sursa(job #1736495)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 1 august 2016 20:41:20
Problema Tricouri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#define MAXN 300010
using namespace std;
int v[MAXN];
vector<int> g[22][22];
int temp[110],dp[22][22];
int main(){
    freopen("tricouri.in","r",stdin);
    freopen("tricouri.out","w",stdout);
    int n,m,i,j,l,q,k,p,howMany;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    sort(v+1,v+n+1);
    for(i=n;i>=1;i--)
        for(j=2;j<=20;j++)
            if(g[j][v[i]%j].size()<5)
                g[j][v[i]%j].push_back(v[i]);
    for(q=1;q<=m;q++){
        scanf("%d%d",&k,&p);
        howMany=0;
        for(i=0;i<=p-1;i++)
            for(j=0;j<g[p][i].size()&&j<k;j++){
                howMany++;
                temp[howMany]=g[p][i][j];
            }
        for(l=1;l<=howMany;l++){
            for(i=k;i>=2;i--)
                for(j=0;j<=p-1;j++)
                    dp[i][j]=max(dp[i][j],temp[l]+dp[i-1][(j+p-temp[l]%p)%p]);
            dp[1][temp[l]%p]=max(dp[1][temp[l]%p],temp[l]);
        }
        if(dp[k][0]==0)
            printf("-1\n");
        else
            printf("%d\n",dp[k][0]);
        memset(dp,0,sizeof(dp));
    }
    return 0;
}