10616

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int N,Q;
int M,D;
int num[210];
int tt;
int dp[210][15][25];

void DP()
{
	dp[0][0][0]=1;

	for(int i=1;i<=N;i++)
	{
		for(int j=0;j<=M;j++)
		{
			for(int k=0;k<D;k++)
			{
				dp[i][j][k]=dp[i-1][j][k];//as no element is added
				if(j)
				{
					int tmp = (D+k-num[i]%D)%D;//in case k-num[i]%10 is less than 0 , D is added
					dp[i][j][k]+=dp[i-1][j-1][tmp];
					//from i-1 elemnts j-1 elements selected where previous remainder was
					//tmp
				}
			}
		}
	}
}

int main()
{
	int kase=1,cnt=1;
	bool flag;
	while(scanf("%d%d",&N,&Q),N+Q)
	{
		for(int i=1;i<=N;i++)
			cin>>num[i];
		flag = 1;
		cnt = 1;
		for(int i=1;i<=Q;i++)
		{
			cin>>D>>M;
			memset(dp,0,sizeof(dp));
			DP();
			if(flag)
			{
				cout<<"SET "<<kase++<<":\n";
				flag = 0;
			}
			cout<<"QUERY "<<cnt++<<": ";
			cout<<dp[N][M][0]<<"\n";
		}


	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *