同余最短路
这个东西是用来解决类似有
problem: 给出
个整数 ,求是否存在一组非负整数 ,使得 。其中 。
首先不难发现假设可以通过一些组合达到
但这个不够优秀。我们需要一个不基于选择物品就可以做到
不难发现一个大小为
qwq
#include<bits/stdc++.h> #define ll long long #define int long long #define pir pair<int, int> #define pb emplace_back using namespace std; const int N = 5e5 + 5, M = 20 + 5, INF = 1e18; int n, l, r, a[M], f[N], mod = INF; inline void chkmin(int& x, int y){if(y < x) x = y;} signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> l >> r; for(int i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + n + 1); int st = 1; while(st <= n && (!a[st])) st++; if(st == n + 1){cout << (l == 0); return 0;} mod = a[st]; for(int i = 0; i < mod; i++) f[i] = INF; f[0] = 0; for(int i = st + 1; i <= n; i++){ for(int j = 0, lim = __gcd(a[i], mod); j < lim; j++){ for(int x = j, c = 0; c < 2; c += (x == j)){ int p = (x + a[i]) % mod; chkmin(f[p], f[x] + a[i]); x = p; } } } int ans = 0; for(int i = 0; i < mod; i++){ if(r >= f[i]) ans += (r - f[i]) / mod + 1; if(l > f[i]) ans -= (l - 1 - f[i]) / mod + 1; } cout << ans; return 0; }
本文作者:Little_corn
本文链接:https://www.cnblogs.com/little-corn/p/18735056
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步