[ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N) 题解
[ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N) 题解
题目描述
求题目中式子的数量。
思路
因为 Exgcd
算法求解。
首先考虑求出一组
因此
根据通解形式可以发现,
所以这个
注意如果是是负数就跳过,要手写
时间复杂度:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define int __int128
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
int n, a, b, c, X, ans;
int down(int a, int b) {
if(a >= 0) return a / b;
return -((-a + b - 1) / b);
}
int up(int a, int b) {
if(a >= 0) return (a + b - 1) / b;
return -((-a) / b);
}
int exgcd(int a, int b, int &x, int &y) {
if(!b) return x = 1, y = 0, a;
int d = exgcd(b, a % b, y, x);
return y -= a / b * x, d;
}
int x, y, d, aa, bb;
void work(int t) {
if(t <= 0) return ;
if(t % d) return ;
int xx = t / d * x, yy = t / d * y;
int l = max(up(1 - xx, bb), up(yy - n, aa));
int r = min(down(n - xx, bb), down(yy - 1, aa));
if(l > r) return ;
ans += r - l + 1;
}
inline int read() {
int x = 0;
char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch <= '9' && ch >= '0') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return x;
}
void write(int x) {
if(x == 0) return ;
if(x > 0) write(x / 10);
putchar(x % 10 + '0');
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
n = read(), a = read(), b = read(), c = read(), X = read();
d = exgcd(a, b, x, y);
aa = a / d, bb = b / d;
for(int i = 1; i <= n; i ++) work(X - c * i);
if(ans == 0) cout << 0 << '\n';
else write(ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端