2024牛客寒假算法基础集训营2补题(K题)

题意

有整数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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值