Ranking (as of 2014-11-11): 84 out of 1192
Language: C++
/*
UVa 10616 - Divisible Group Sums
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_10616_Divisible_Group_Sums.cpp
*/
#include <cstdio>
const int N_max = 200, D_max = 20, M_max = 10;
int integers[N_max + 1];
long long nr_ways[N_max + 1][M_max + 1][D_max];
// nr_ways[i][j][k] is the number of ways
// where sum of j integers out of i has the modulo value of k
// 1 <= i <= N, 1 <= j <= M, 0 <= k < D
int main()
{
for (int s = 1; ; s++) {
int N, Q;
scanf("%d %d", &N, &Q);
if (!N && !Q)
break;
for (int i = 1; i <= N; i++)
scanf("%d", &integers[i]);
printf("SET %d:\n", s);
for (int q = 1; q <= Q; q++) {
int D, M;
scanf("%d %d", &D, &M);
for (int i = 1; i <= N; i++)
for (int j = 1; j <= M; j++)
for (int k = 0; k < D; k++)
nr_ways[i][j][k] = 0;
for (int i = 1; i <= N; i++) {
for (int k = 0; k < D; k++)
nr_ways[i][1][k] = nr_ways[i - 1][1][k];
int r = integers[i] % D;
if (r < 0)
r += D;
nr_ways[i][1][r]++;
for (int j = 2; j <= N && j <= M; j++)
for (int k = 0; k < D; k++)
nr_ways[i][j][(r + k) % D] = nr_ways[i - 1][j][(r + k) % D] +
nr_ways[i - 1][j - 1][k];
#ifdef DEBUG
for (int j = 1; j <= N && j <= M; j++)
for (int k = 0; k < D; k++)
printf("[%d][%d][%d]: %lld%c", i, j, k,
nr_ways[i][j][k], ((k < D - 1) ? ' ' : '\n'));
#endif
}
printf("QUERY %d: %lld\n", q, nr_ways[N][M][0]);
}
}
return 0;
}
No comments:
Post a Comment