码迷,mamicode.com
首页 > 其他好文 > 详细

E. 因数串

时间:2020-07-23 16:16:58      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:back   max   ack   tac   include   div   map   string   不同   

题目链接:https://acm.ecnu.edu.cn/contest/292/problem/E/

 

想法:

我们直接考虑dfs搜索,dfs(now),从后往前(也可以从前往后)找第一个可以增加或减少的,那些不能动的就换方向,这个能的计算后就输出,dfs下一个数,然后break,这样构造就能保证每个输出的数他都是不同的

每次搜索的时候注意换一下方向就可以了

 

#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <ctime>
#include <bitset>
#include <cmath>
#include <sstream>
#include <iostream>
#include <unordered_map>

#define ll long long
#define ull unsigned long long
#define ls nod<<1
#define rs (nod<<1)+1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define INF 0x3f3f3f3f
#define max(a, b) (a>b?a:b)
#define min(a, b) (a<b?a:b)


const double eps = 1e-8;
const int maxn = 1e5 + 10;
const ll MOD = 1e9 + 7;
const int mlog=20;

int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }

using namespace std;

const int N = 20,M = 70;
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;
}

 

E. 因数串

标签:back   max   ack   tac   include   div   map   string   不同   

原文地址:https://www.cnblogs.com/-Ackerman/p/13365583.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!