CF710D Two Arithmetic Progressions
原题链接
即求在[L,R]之间有多少个整数K满足K=a1x+b1=a2y+b2,其中x,y为自然数
很容易想到将等式移项,变为a1x+a2(−y)=b2−b1
那么很明显可以用扩欧来求出一组x,y的特解,并将特解移至自然数范围内的最小解
因为原式是等式,接下来我们只需要关注其中一个解,例如x
设扩欧求出的x的通解为x0+k×MOD,其中MOD=a2/gcd,因为特解x0是摸MOD下最小自然数解,所以k也为自然数
题目要求的是[L,R]之间有多少个整数K满足K=a1x+b1
将通解代入,即求[L,R]之间有多少个整数K满足K=(a1MOD)k+a1x0+b1
那么最后就是求有多少k能让整数落于[L,R],因为k连续,所以直接算不大于R的最大k和不小于L的最小k即可
写成公式就是⌊R−(a1x0+b1)a1MOD⌋−⌈L−(a1x0+b1)a1MOD⌉+1
但要注意可能会除出来负数,因为k为自然数,要手动调到0,具体见代码。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int mod = 1073741824;
inline ll re()
{
ll x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
ll exgcd(ll a, ll b, ll& x, ll& y)
{
if (!b)
{
x = 1; y = 0;
return a;
}
ll gcd = exgcd(b, a % b, y, x);
y -= a / b * x;
return gcd;
}
int main()
{
ll i, j, k, n, m, a_1, a_2, b_1, b_2;
a_1 = re(); b_1 = re(); a_2 = re();
b_2 = re(); n = re(); m = re();
ll x, y, gcd = exgcd(a_1, a_2, x, y);
if ((b_2 - b_1) % gcd)//无解
return printf("0"), 0;
x *= (b_2 - b_1) / gcd;//一组特解
y *= (b_2 - b_1) / gcd;
ll MOD = a_2 / gcd;
x = (x % MOD + MOD) % MOD;//先让x落于自然数范围
y = -((b_2 - b_1) - a_1 * x) / a_2;//算出此时的y
if (y < 0)//若y还是负数就让y落于自然数范围并计算出x,此时x一定为自然数
{
ll MODY = a_1 / gcd;
y = (y % MODY + MODY) % MODY;
x = ((b_2 - b_1) + a_2 * y) / a_1;
}
m = floor(1.0 * (m - a_1 * x - b_1) / (a_1 * MOD));//计算最大的k
if (m < 0)//不大于右边界的最大k都为负,那么一定不存在解
return printf("0"), 0;
n = ceil(1.0 * (n - a_1 * x - b_1) / (a_1 * MOD));//计算最小的k
if (n < 0) n = 0;//k不能小于0
printf("%lld", m - n + 1);
return 0;
}
posted on 2021-01-14 20:22 Iowa_Battleship 阅读(113) 评论(2) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix