来追梦-D1295 小F过河
依旧是固定的前言。拿下了第四名和第三名同分结果提交次数多了。发现第三名是我的同学并且比我弱之后大胆猜测他使用的奇怪的方法。结果看了他T3的代码的确如此他居然转移的时候只转移前面和后面的 个然后数据太水过了。显然是在模仿CCF数据也太好了确信。话不多说我的得分情况90100200210第一题没有做出来挺离谱的所以我写T2题解接下来开始我们的正题题目意思你现在有两种操作一种是将你现在手持的数字加上 耗费 的价值另一种是将手持的乘上 耗费 的价值要你从 变到 的最小价值如果不行就报告不可能。题目思考这是我在草稿纸上面的思路首先我们可以将多次的加合并为 多次的乘合并为我尝试证明操作序列为 或者 但是发现不能证明所以这说明他可能进行了若干次 的操作所以不妨设我们依次进行了 次 操作 次 操作 次 操作 次 操作以此类推。此时我们考虑他的最终数字经过 次 操作后变为 经过 次操作后变为 经过 次 操作 次 后变为接下来式子就化的差不多了我们去看经过这些操作时候他的代价是多少经过 次 操作 次 操作后代价是 现在还看不出什么但经过 次 操作 次 后代价变为 然后观察 前面的系数发现 就是最后变成的数字里面含有 的项前面的系数观察 的系数发现 就是最高次项的次数也就是所谓的 所以正确思路就出来了。思路我们发现 所以我们枚举 的值除非 这个值必然小于 所以首先我们特判 的值接着我们对于每一个枚举的 的贡献已经固定了所以我们要使 的贡献尽量小观看式子 所以我们要让 的系数尽可能大接着是 的系数尽可能大这样就能让系数之和尽可能小了具体的可以尝试借助代码理解我就使用了 存储不然可能炸掉。代码#includealgorithm#includeiostream#includecstring#includeclimits#includecmath#define ll __int128using namespace std;const ll Inf0x3f3f3f3f3f3f3f3f,N1e59;ll n,x,xx,c,cc,a[N],ans;int main(){int garbage,T;cingarbageT;while(T--){long long inputn,inputx,inputc,inputcc,inputxx;cininputninputxinputcinputxxinputcc;ninputn;xinputx;cinputc;xxinputxx;ccinputcc;if(xx1){if(x0){cout-1\n;continue;}if((n-1)%x0) cout(long long)(c*(n-1)/x)endl;else cout-1\n;continue;}ll cnt1;a[0]1;ansInf;while(a[cnt-1]n) a[cnt]a[cnt-1]*xx,cnt;cnt--;for(int icnt;i0;i--){ll nnn-a[i],nansi*cc;if(nn0) continue;for(int ji;j0;j--){if(a[j](nx-1)/x) continue;if(nnx*a[j]){ll tmpnn/(x*a[j]);nanstmp*c;nn%(x*a[j]);}}if(nn!0) continue;ansmin(ans,nans);}if(ansInf) cout-1\n;else cout(long long)ansendl;}return 0;}