E. 因数串

E. 因数串

思路:递归,关键是递归的顺序以及实现过程,显然可以按顺序搜,如果当前已经搜过了就倒着类似类似除法搜。每次搜完都更换一下是否被搜过。

传送门

#include
using namespace std;
typedef long long ll;
const int N=20,M=65,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first
#define se second
#define pb push_back
ll f[N][M];
int p[N],k[N],n;
bool vis[N]; 
void dfs(int id,ll x){
	if(id==n+1){
		printf("%lld\n",x);
		return;
	}
	if(!vis[id]){
		for(int i=0;i<=k[id];i++)
			dfs(id+1,x*f[id][i]);
	}
	else {
		for(int i=k[id];i>=0;i--)
			dfs(id+1,x*f[id][i]);
	}
	vis[id]^=1;
} 
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&p[i],&k[i]);
		f[i][0]=1;
		for(int j=1;j<=k[i];j++)
		 	f[i][j]=f[i][j-1]*p[i]; 
	}
	dfs(1,1); 
	return 0;
}

你可能感兴趣的:(DFS)