题意
给两个整数,q和d。d是幸运数字,如果一个数的数位上至少有一个d,则是幸运数,现需判断q是不是幸运数?
假设d为7
-
>=70
的数都是幸运数。只需要按位分解为7a+b7的两数相加。例
q=86,86-77=9,因此a=9,b=0,86=79+7。
q=103,103-77=26,因此a=6,b=2. 103=76+27。
q=158,158-77=81%70=11 且 81/70=1,因此a=1,b=1,158=70+71+17. -
<70
需要判断是否比由最小的7构成大。若大于,则十位上多余的可随意放在任意一个7的十位。例
q=51,已知3x7=21,51>21,因此肯定可以构成,51=37+7+7。
q=52,已知6x7=42,52>42,因此肯定可以构成,52=17+7+7+7+7+7.
q=53,已知9x7=63,53<63,因此肯定构不成。
代码
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
typedef long double ld;
const int maxn=1e5+5;
int vis[104];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin>>t;
while(t--){
int d,q;
cin>>q>>d;
memset(vis,0,sizeof(vis));
//逆序保证为最小的数量
for(int i=10;i>=1;i--){
vis[i*d%10]=i;
}
int temp;
for(int i=1;i<=q;i++){
cin>>temp;
if(temp>=d*10 || (vis[temp%10] && temp>=vis[temp%10]*d)){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
}
return 0;
}