E. 因数串
思路:递归,关键是递归的顺序以及实现过程,显然可以按顺序搜,如果当前已经搜过了就倒着类似类似除法搜。每次搜完都更换一下是否被搜过。
#include<bits/stdc++.h>
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<int,int>
#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;
}