Problem:
Problem H: Nearest Station

うさぎがある電車のチケットをn 枚持っている. チケットにはそれぞれ0 からn − 1 までの番号がついていて, k 番のチケットを使うと, p⋅ak + q⋅bk 駅進むことができる.

うさぎは今いる駅からm 駅進んだ駅にあるニンジン食べ放題の店に行きたいが, なるべく歩く距離を短くしたい. 駅は等間隔に並んでいる. チケットを電車の上り線で進むことのみに用いるとき, うさぎは最小何駅分の徒歩で店に着けるか.

Input

1 ≤ n, m, a, b, p, q ≤ 1 000 000 000 000 (整数)

Output

うさぎは最小何駅分の徒歩で店に着けるか, その数を一行に出力せよ.

Sample Input 1

6 200 2 3 4 5

Sample Output 1

1

Sample Input 2

6 1 2 3 4 5

Sample Output 2

1

Solution in C++11 (judge verdict: Time Limit Exceeded)

#include<bits/stdc++.h>
using namespace std;

#define int long long

#define rep(i,n) for(int i=0;i<(n);i++)
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define fi first
#define se second
typedef vector<int>vint;
typedef pair<int,int>pint;
typedef vector<pint>vpint;

template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}
template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}

int N,M,A,B,P,Q;

int ans;

void dfs(int n,int s,int x,int y){
    if(n==0)return;
    chmin(ans,abs(M-s));
    if(1.0*x*A>1e18||1.0*y*B>1e18)return;
    dfs(n-1,s+x*A+y*B,x*A,y*B);
    dfs(n-1,s,x*A,y*B);
}

void dfs2(int n,int f,int s,int m){
    if(n==0){
        chmin(ans,abs(s-m));
        return;
    }
    if(n-1>=f)dfs2(n-1,f,s,m);
    if(f&&(s<=m||n==f)){
        dfs2(n-1,f-1,s+Q*(1ll<<(n-1)),m);
    }
}
signed main(){
    cin>>N>>M>>A>>B>>P>>Q;

    if(A>B){
        swap(A,B);swap(P,Q);
    }

    ans=M;
    dfs(min(N,26ll),0,P,Q);
    dfs(min(N,26ll),P+Q,P,Q);

    if(B==1){
        P+=Q;
        if(M/P>N)chmin(ans,abs(M-N*P));
        else{
            chmin(ans,abs(M-M/P*P));
            if(M/P+1<=N)chmin(ans,abs(M-M/P*P-P));
        }
    }
    else if(A==1&&B==2){
        int t=1;
        while(Q*(1ll<<t)<1e15)t++;
        chmin(t,N);
        for(int i=1;i<=t;i++){
            dfs2(t,i,0,M-i*P);
        }
    }
    else if(B==2){
        P+=Q;
        int t=1;
        while(Q*(1ll<<t)<1e15)t++;
        chmin(t,N);
        for(int i=1;i<=t;i++)dfs2(t,i,0,M);
    }
    cout<<ans<<endl;
    return 0;
}