題目大意:給出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; }