因数串 解题报告

原题地址:https://acm.ecnu.edu.cn/contest/292/problem/E/

观察样例,我们容易想到用递归构造这个数列。

预处理出 p i ( i ≤ k ) p^i(i\leq k) pi(ik),然后倒着递归,对于每层,如果上一次是正着枚举,则这次反着枚举,否则正着枚举。

代码:

#include
using namespace std;
 int n;
 long long p[15];
 int k[15];
 long long f[15][61];
 bool vis[15];
void dg(long long now,int i)
{
 if (i == 0)
 {
  printf("%lld\n",now);
  return;
 }
 if (!vis[i])
 {
  for (int j = 0;j <= k[i];j ++)
   dg(now * f[i][j],i - 1);
 }
 else
 {
  for (int j = k[i];j >= 0;j --)
   dg(now * f[i][j],i - 1);
 }
 vis[i] = !vis[i];
}
int main()
{
 scanf("%d",&n);
 for (int i = 1;i <= n;i ++)
 {
  scanf("%lld%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];
 }
 dg(1,n);
 return 0;
}

你可能感兴趣的:(递归)