【CSP】202209-1 如此編碼

dudujerry發表於2024-03-19

題目大意:給出n個引數a1~an和量m,ci = 求和(1,i,k)(ak)。

已知m = 求和(1,n,i)(ci-1 * bi)

求滿足條件的唯一序列{bn}

分析:發現該序列屬於係數單調增加的一次多項式,首先考慮到取模。發現取模操作的可能性不唯一,於是考慮dfs爆搜所有取模可能性,AC。

#include <cstdio>
#include <iostream>
#include <string.h>
#include <cstring>
#include <algorithm>

#define up(l,r,i) for(int i=l;i<=r;i++)
#define dn(l,r,i) for(int i=r;i>=l;i--)

typedef long long ll;

using namespace std;

inline int _max(const int& a,const int& b){return a>b?a:b;}
inline int _min(const int& a,const int& b){return a<b?a:b;}

const int MAXN = 22;

struct Ans{
    int b[MAXN];
    Ans(){memset(b,0,sizeof(b));}
    Ans cpy(){
        Ans ret;
        up(1,20,i) ret.b[i] = b[i];
        return ret;
    }
};

ll n;
ll m;
ll a[MAXN];
ll c[MAXN];
ll ans[MAXN];

bool dfs(ll M,int pos){
    if(pos == 1){
        if(M >= a[pos]) return false;
        else {
            cout<<M<<" ";
            return true;
        }
    }
    ll mx = _min(M/c[pos-1],a[pos]-1);
    up(0,mx,i){
        ll to = M - i*c[pos-1];
        //printf("i=%d,mx=%lld,M/=%lld,to=%lld\n",i,mx,M/c[pos-1],to);
        bool r = dfs(to,pos-1);
        if(r == true){
            cout<<i<<" ";
            return true;
        }
    }
    return false;
}

int main()
{
    cin>>n>>m;
    c[0] = 1;
    up(1,n,i) {cin >> a[i];c[i] = c[i-1] * a[i];}
    
    dfs(m,n);


    return 0;
}

相關文章