题解:P12243 [蓝桥杯 2023 国研究生组] 混乘数字

· · 题解

传送门

考虑写一份程序来求答案后输出该答案。

先枚举 ab,且保证 a\times b 小于等于 10^6。接下来枚举 a\times b 在十进制下每一位数字并开一个桶记录 09 出现的次数。然后枚举 ab 在十进制下的每一位数字,枚举一位之后就将它在桶中的出现次数减一。最后判一下这个桶中 09 每一位所表示的出现次数是否都为 0,如果是就给 a\times b 打上标记。然后将 110^6 中所有打过标记的数字个数统计一下即可。

最终求出答案为 590

CODE:

答案求解程序:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool v[1000010];
int ans=0;
int main()
{
    for(register ll a=1;a<=1e6;a++)
        for(register ll b=1;a*b<=1e6;b++)
        {
            int cnt[20]={0};
            ll t=a*b;
            while(t) cnt[t%10]++,t/=10;
            t=a;
            while(t) cnt[t%10]--,t/=10;
            t=b;
            while(t) cnt[t%10]--,t/=10;
            int f=1;
            for(register int i=0;i<=9;i++) if(cnt[i]){f=0;break;}
            if(f) v[a*b]=1;
        }
    for(register int i=1;i<=1e6;i++) ans+=v[i];
    printf("%d\n",ans);
    return 0;
}

答案输出程序:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    puts("590");
    return 0;
}