赞
踩
给两个整数,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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。