UVA_10616

    我们可以用f[i][j][k]表示选到第i个数时一共选了j个数且它们的和模D的值为k,由于第i个数可以选也可以不选,那么就有f[i][j][k]=f[i-1][j][k]+f[i-1][j-1][x],其中x满足0<=x<D且(x+a[i]%D)%D=k,边界为f[0][0][0]=1。

#include<stdio.h>
#include<string.h>
#define MAXN 210
#define MAXD 30
#define MAXM 15
int N, Q, M, D;
long long int a[MAXN], f[MAXN][MAXM][MAXD];
void solve()
{
int i, j, k, t;
memset(f, 0, sizeof(0));
f[0][0][0] = 1;
for(i = 1; i <= N; i ++)
for(j = 0; j <= M; j ++)
for(k = 0; k < D; k ++)
{
f[i][j][k] = f[i - 1][j][k];
if(j)
{
t = (D + k - a[i] % D) % D;
f[i][j][k] += f[i - 1][j - 1][t];
}
}
printf("%lld\n", f[N][M][0]);
}
int main()
{
int i, j, t = 0;
for(;;)
{
scanf("%d%d", &N, &Q);
if(!N && !Q)
break;
for(i = 1; i <= N; i ++)
scanf("%lld", &a[i]);
printf("SET %d:\n", ++ t);
for(i = 1; i <= Q; i ++)
{
scanf("%d%d", &D, &M);
printf("QUERY %d: ", i);
solve();
}
}
return 0;
}


posted on 2011-12-17 21:49  Staginner  阅读(387)  评论(0编辑  收藏  举报