参考:http://www.cnblogs.com/clrs97/p/5125976.html 瞎搞约数失败...滚去搜索 dfs(x,y,z) 表示当前可选第x到第m个约数,还要选y个约数,已有z的乘积,搜的时候减掉大于n的情况 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=2005; int n,k,tot,q[N],f[N][35];…
首先将$n$的约数从小到大排序,设$dfs(x,y,z)$表示当前可以选第$x$个到第$m$个约数,还要选$y$个,之前选的乘积为$z$是否可能. 爆搜的时候,如果从$x$开始最小的$y$个相乘也超过了$n$,那么就不合法,加上这个剪枝即可. #include<cstdio> #include<algorithm> #define N 2000 int T,n,k,m,i,j,q[N],f[N][22]; int dfs(int x,int y,int z){ if(!y)retu…