Exciting Days

可以发现,在极限情况()时,所有可能作为日期的 的自然数次幂也不会超过 个。

我们对于每个月都枚举一遍所有的 ,判断其字符串长度是否比表示月份的字符串长度小、前缀是否为月份、去掉表示月的部分(即应该表示日的部分)数值是否小于该月天数以及有无前导

本题涉及字符串与整数间的转换较多,力推 std::stoll(字符串转数字)std::to_string(数字转字符串)std::equal(判断区间是否相等) 等 STL 函数。

#include<bits/extc++.h>
using namespace std;
namespace pbds=__gnu_pbds;
using ui=unsigned int;
using uli=unsigned long long int;
using li=long long int;
int main(void){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    size_t T;
    cin>>T;
    while (T--){
        size_t n;ui k;cin>>n>>k;
        vector<string> kpow({to_string(k)});
        if (k>1) while (__uint128_t(stoll(kpow.back()))*k<=numeric_limits<uli>::max())
            kpow.push_back(to_string(stoll(kpow.back())*k));
        vector<pair<ui,ui>> ans;
        for (size_t i=1;i<=n;++i){
            string month=to_string(i);
            ui x;cin>>x;
            if (k>1)
            for (string const& j:kpow) if (month.size()<j.size()
                &&equal(month.cbegin(),month.cend(),j.cbegin())){
                    string k(j.cbegin()+month.size(),j.cend());
                    if (k.front()!='0'&&stoll(k)<=x) ans.emplace_back(i,stoll(k));
                }
        }
        cout<<ans.size()<<'\n';
        for (pair<ui,ui> i:ans) cout<<i.first<<' '<<i.second<<'\n';
    }
    return 0;
}
posted @ 2024-03-11 12:03  MrPython  阅读(5)  评论(0)    收藏  举报  来源