首页 > 其他分享 >[ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N) 题解

[ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N) 题解

时间:2023-08-21 17:24:44浏览次数:47  
标签:Ck lfloor lceil return Ai 题解 int read dfrac

[ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N) 题解

题目描述

求题目中式子的数量。

思路

因为 \(N\le 10^6\),所以考虑枚举 \(k\),那么变为求 \(ai+bj=x-ck, i, j\in[1,N]\),这个问题可以通过 Exgcd 算法求解。

首先考虑求出一组 \(i, j\) 的特解 \(x', y'\),根据通解 \(x = x' + tb, y = y' - ta\) 可以得知,\(x'+tb\in[1, N], y'-ta\in[1,N]\),解不等式之后得到下面的条件需要满足:

\[\lceil \dfrac{1-x'}{b} \rceil\le t\le\lfloor \dfrac{N-x'}{b} \rfloor\\ \lceil \dfrac{y'-N}{a}\rceil\le t\le \lfloor \dfrac{y'-1}{a} \rfloor \]

因此 \(t\) 最小可以取到:

\[\max(\lceil \dfrac{1-x'}{b} \rceil, \lceil \dfrac{y'-N}{a}\rceil) \]

\(t\) 最大可以取到:

\[\min(\lfloor \dfrac{N-x'}{b} \rfloor, \lfloor \dfrac{y'-1}{a} \rfloor) \]

根据通解形式可以发现,\(t\) 的取值是连续的。

所以这个 \(k\) 对答案的贡献即为:

\[\max(\lceil \dfrac{1-x'}{b} \rceil, \lceil \dfrac{y'-N}{a}\rceil) -\min(\lfloor \dfrac{N-x'}{b} \rfloor, \lfloor \dfrac{y'-1}{a} \rfloor) \]

注意如果是是负数就跳过,要手写 \(ceil(), floor()\),因为 c++ 默认向 \(0\) 取整。

时间复杂度:\(O(N+\log C)\)。

#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;
}

标签:Ck,lfloor,lceil,return,Ai,题解,int,read,dfrac
From: https://www.cnblogs.com/MoyouSayuki/p/17646579.html

相关文章

  • Codeforces Round 893 (Div. 2) A-C题解
    CF893(Div.2)A.Buttons签到题。两人会优先选择c中的按钮来,避免自己的按钮消耗同时减少对方可选择的按钮。所以c%2==1等价于a的按钮数+1,c%2==0时相当于c按钮不存在,比较ab按钮的数量来得出答案即可。#include<iostream>usingnamespacestd;typedeflonglong......
  • 基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布
    关于MobileIMSDKMobileIMSDK是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp,服务端基于Netty编写。工程开源地址是:1)Gitee码云地址:https://gitee.com/ja......
  • CF1101F Trucks and Cities
    题目大意有\(n\)个城市坐落在一条数轴上,第\(i\)个城市位于位置\(a_i\)。城市之间有\(m\)辆卡车穿行。每辆卡车有四个参数:\(s_i\)为起点编号,\(f_i\)为终点编号,\(c_i\)表示每行驶\(1\)个单位长度需要消耗的油量,\(r_i\)表示可以在路途中加油的次数。当卡车到达一个城......
  • [AGC005C] Tree Restoring 题解
    比较简单的题。思路我们可以把一棵树抽象成一条极长的链上挂了很多的点。观察这样的树的性质。除去中间的每一个\(dis\)至少有两个点的\(a_i=dis\)。考虑这条链的长度为\(s\)。那么对于中间的点,我们可以分两种情况讨论。\(s\)为偶数那么我们必然要求在中间的权值只......
  • AI 绘画
    一、ChatGPT作图1.ChatGPT+代码作图我想要设计一张“小红书封面图”,要求如下:尺寸比例3:4,即宽度为1030像素,高度为1440像素。背景为渐变色,从#BDECC5到#19b898。以上要求使用canvas实现,并把js代码都内联到html里面。 2.ChatGPT+第三方网站作图3.其他ChatGPT作图方式 ......
  • dockerfile搭建activemq5.16.5
    dockerfile搭建activemq5.16.5搭建环境最小化的centos7.5家目录下完成如下操作环境构建脚本#!/bin/bash#authorbygwl###2023-02-10docker安装配置yuminstallwgetntpdatetelnetvimnet-toolsbash-completiongccgcc-c++make-ysed-i.bak's/SELINUX=enfor......
  • RocketMQ源码(四):RocketMQ生产者发送消息流程
    RocketMQ通过Producer发送消息,以同步方式发送普通消息为例,分析发送消息的整体流程。Producer的示例代码如下:1importorg.apache.rocketmq.client.producer.DefaultMQProducer;2importorg.apache.rocketmq.client.producer.SendResult;3importorg.apache.rocketmq.......
  • 狗狗求职记:AI 面试、人类辅助,美研究所利用 628 只拉布拉多数据,提升嗅觉检测犬选拔效率
    内容一览:犬类嗅觉灵敏,是执行困难任务的得力助手。然而,工作犬选拔需要经过严格的筛选和训练,淘汰率极高。利用监督式机器学习和任务数据,可以用来预测人类工作表现,然而,目前尚未发现类似的犬类研究。关键词:工作犬  监督式机器学习  随机森林本文首发于HyperAI超神经微信公众平......
  • Mac下 Docker 动态添加端口
    开始发现开放的端口不够用了,但是还不想重新创建容器咋整①查看containerid不管是使用dockerps,dockerps-a,dockerinspectcontainerName哪种方式先获得容器的id这里我使用inspectdockerinspectmnginx|grepId返回的信息如下:"Id":"27b898aa3e89054dfa5b8c898b0......
  • LangChain + Streamlit + Llama:将对话式AI引入本地机器
    推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景什么是LLMS?大型语言模型(LLM)是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用包括书籍、文章、网站和其他来源在内的广泛数据集进行训练。通过分析数据中的统计模式,LLM可以预......