竞赛讨论区 > B题题解
头像
王乐言
发布于 2022-10-06 22:18 安徽
+ 关注

B题题解

B 和积
直接枚举时间复杂度为O(nT),肯定TLE。所以要换一种方法枚举。
注意到k<=100,我们可以枚举第一位,第二位,……第六位(注意,第七位不用枚举,因为数字和是k,可以直接算)。
至于这些数位的乘积,开个数组预处理一下就行了。
总时间复杂度:T*6*105 =6*107
#include<bits/stdc++.h>
using namespace std;
const int N=6e6+10;
int mul[N];
int f2(int x)  //mul
{
    int res=1;
    while(x)
    {
        res*=x%10;
        x/=10;
    }
    return res;
}
void init()
{
    for(int i=1;i<=N-10;i++)
        mul[i]=f2(i);
}
int main()
{
    init();
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int x=INT_MAX,minn=0,l,r,k;
        scanf("%d%d%d",&l,&r,&k);
        for(int a1=0;a1<=5&&a1<=k;a1++)
            for(int a2=0;a2<=9&&a1+a2<=k;a2++)
                for(int a3=0;a3<=9&&a1+a2+a3<=k;a3++)
                    for(int a4=0;a4<=9&&a1+a2+a3+a4<=k;a4++)
                        for(int a5=0;a5<=9&&a1+a2+a3+a4+a5<=k;a5++)
                            for(int a6=0;a6<=9&&a1+a2+a3+a4+a5+a6<=k;a6++)
                            {
                                int a7=k-a1-a2-a3-a4-a5-a6;
                                if(a7>9||a7<0) continue;
                                int num=a7+a6*10+a5*100+a4*1000+a3*10000+a2*100000+a1*1000000;
                                if(num<l||num>r) continue;
                                if(mul[num]>minn||(mul[num]==minn&&num<x)) x=num,minn=mul[num];
                            }
        printf("%d %d\n",x,minn);
    }
    return 0;
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐