题意:
找出n个数字构成集合,使集合中的所有数的和等于所有数的积;
思路:
dfs暴力;
我们假设集合从小到大排了,易得集合里最大的数只能到n所以直接暴力枚举;
如果出现当前的和已经比积小了,就结束(重点剪纸,数据量最大是500,所以理论上dfs会达到500^500,但是这个剪枝能去掉几乎全部的情况,剩下小部分);
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ans,n;
void dfs(int num, int cur, int sum, int product, int Min) {
if(cur == num && sum == product) {
ans++;
return ;
}
if(cur > num || (cur == num && sum != product))
return ;
for(int i = Min; i <= num; i++) {
sum += i;
product *= i;
if(product > sum)
break;
dfs(num,cur+1,sum,product,i);
sum -= i;
product /= i;
}
}
int main() {
int t;
int cas = 1;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
ans = 0;
dfs(n,0,0,1,1);
printf("Case %d: %d\n",cas++, ans);
}
return 0;
}