题意
有整数n,字符串s,整数y,求小于等于y的所有满足条件的整数的个数(无前导0,能整除8,相同位置字母相同则数字相同,不同则代表不同,下划线代表所有都可以。
思路
因为范围很小,所有暴力枚举所有可能性就可以了,多重循环,枚举不同的字符串,再用从榜一大哥哪里学来的可以把字符串转换成int返回的c++自带函数stoi(),直接判断能不能整除八,这算是新的收获了,然后如果满足条件<=y且能整除8,就存进map里面(提前开一个map<ll,ll>),最后统计map的长度输出就是答案了
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2e5+5;
const ll mod=1e9+7;
#define inf 0x7f7f7f7f7f7f
map<ll,ll>p;//统计答案
int main()
{
ios::sync_with_stdio(false); //快读
cin.tie(0);
cout.tie(0);
ll t;
cin>>t;
while(t--)
{
p.clear();
ll n,y;
string s;
cin>>n>>s>>y;
char a,b,c,d,_;
//暴力枚举所以可能情况
for(a='0';a<='9';a++)
{
for(b='0';b<='9';b++)
{
for(c='0';c<='9';c++)
{
for(d='0';d<='9';d++)
{
for(_='0';_<='9';_++)
{
if(a==b||a==c||a==d||b==c||b==d||c==d)continue;
string ss;
ss=s;
for(auto &x:ss)
{
if(x=='a')x=a;
else if(x=='b')x=b;
else if(x=='c')x=c;
else if(x=='d')x=d;
else if(x=='_')x=_;
}
if(n>1&&ss[0]=='0')continue;
ll k;
k=stoi(ss);//新学的可以将字符串转换为整除的小函数,省事了
//如果满足条件则存进map里面
if(k<=y&&(k%8)==0)p[k]=1;
}
}
}
}
}
cout<<p.size()<<endl;//map的长度就是答案
}
return 0;
}