CF889E
题目大意: 给出正整数 和序列 ,定义 ,求 。
.
首先容易发现答案的 一定是某个 。
这就可以 做了。
然后尝试把 用 DP 做,设 为做到第 项, 的答案。
发现所有转移都是有意义转移,不好搞。
考虑 的时候,贡献都是一样的,所以把贡献变为 的形式,此时 就不需要转移了。
分析取模的过程发现 每次“有效取模”后至多是原本的一半。
因此只会有 次转移发生于此。
做完了。复杂度 。
#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,d) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
const int N=2e5+10;
int n,m;
ll a[N];
map<ll,ll> f;
void trans(ll &a,ll b){a=(a>b?a:b);}
int main(){
scanf("%d",&n);
fo(i,1,n)scanf("%lld",&a[i]);
f[a[1]-1]=0;
fo(i,2,n){
for(map<ll,ll>::iterator it=f.lower_bound(a[i]);it!=f.end();++it){
trans(f[it->first % a[i]] , it->second + (ll)(i-1)*(it->first-it->first%a[i]));
if(it->first>=a[i])trans(f[a[i]-1] , it->second + (ll)(i-1)*(it->first - it->first % a[i] -1 - (a[i]-1)));
}
f.erase(f.lower_bound(a[i]),f.end());
}
ll ans=0;
for(auto it:f){
trans(ans , it.second + it.first*n);
}
printf("%lld\n",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2021-11-18 记:关于费马平方和定理的证明