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) 回帖