Sample Input
4 3 9 1 1 2 6 3 9 1 2 3 3 5 2 3 1 1 1 1 1 9 9 9 1 2 3 4 5 6 7 8 9
Sample Output
1 0 10 60
题意:
已知有两个门,要求将人分为两组,两组的“和”分别等于两个门的数字,当然也可以全部进入一个门
思路:(NeverMoreH)
如果能找到满足题意的解,一定满足a和b的和等于n个人的标号的和,所以我们只需要判断n个人的标号组成a的情况有多少(或者只判断b,一样),同时还要注意可以把n个人都分给a,或者都分给b,这样也是满足的。(果然还是缺乏经验- -,想不到方法)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define N 500010
#define mod 258280327
int q[100050];
int dp[100005][10];
int Sum(int x,int y)
{
int temp = x + y;
int ans = temp % 9;
if(ans == 0)
return 9;
return ans;
}
int main()
{
int T,n,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&a,&b);
int sum = 0;
for(int i = 1; i <= n ; i++)
{
scanf("%d",&q[i]);
sum = Sum(sum,q[i]);
}
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= 9; j++)
{
dp[i][j]+=dp[i-1][j];
dp[i][Sum(j,q[i])] +=dp[i-1][j];
dp[i][j] %= mod;
dp[i][Sum(j,q[i])] %= mod;
}
int ans = 0;
ans = (ans+dp[n][a]) * (Sum(a,b) == sum);
if(sum == a && ans == 0)
ans++;
if(sum == b)
ans++;
printf("%d\n",ans);
}
return 0;
}