大致题意:在1~9中给你一个基准数d,如果它在十进制表示中出现至少出现1次,那么我们称它为幸运数,现在给你一个任意一个数,问你是否能表示成幸运数之和
首先证明:对于x >= 10 * d的数都成立
令q = x - 10 * d; 如果q < 10那么 x 一定是幸运数(70~79)
如果q >= 10 , 那么q一定可以拆分成在(10~q)中的最大幸运数q’ + d’,d’一定是个位数,进而能将d’ + 10 * d所以全部成立
再证明:对于x < 10 * d 的数满足 x = d * m + 10 * n 的情况下是全部成立的;
令 q = d * k + 10,这里k表示 所有m的最大值 则再此基础上 d * (k - 1) + (10 + d)仍然满足题意 以此类推可证成立
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main()
{
int t;
cin >> t;
while (t --)
{
int q , d;
cin >> q >> d;
for (int i = 1; i <= q; i ++ ) cin >> a[i];
for (int i = 1; i <= q; i ++ )
{
if (a[i] >= 10 * d)
{
cout << "YES" << endl;
continue;
}
else
{
int fl = 0;
for (int j = 1; j <= 9; j ++ )
{
int m = d * j;
if (a[i] - m >= 0 && (a[i] - m) % 10 == 0) // 注意到 a[i] - m 必须>=0 否则判断出错
{
cout << "YES" << endl;
fl = 1;
break;
}
}
if (!fl) cout << "NO" << endl;
}
}
}
return 0;
}