题目链接:https://nanti.jisuanke.com/t/A2021
题解:给的数据,好像在告诉你怎么做,把每个一拆出来就好了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
int n, q;
ll dp[10010], val[410];
int len;
int main() {
int T;
int x, y;
scanf("%d", &T);
while(T--) {
len = 0;
memset(dp, 0, sizeof(dp));
scanf("%d%d", &n, &q);
for(int i = 1; i <= n; i++) {
scanf("%d %d", &x, &y);
y = (1 << y) - 1;
for(int j = 1; j <= y; j <<= 1) {
val[++len] = x * j;
// cout << j << endl;
}
}
// cout << 1 << endl;
dp[0] = 1;
for(int i = 1; i <= len; i++)
for(int j = 10000; j >= val[i]; j--)
dp[j] = (dp[j] + dp[j - val[i]]) % mod;
while(q--) {
scanf("%d", &x);
printf("%lld\n", dp[x]);
}
}
return 0;
}