Processing math: 100%
一名苦逼的OIer,想成为ACMer

Iowa_Battleship

CF710D Two Arithmetic Progressions

原题链接

即求在[L,R]之间有多少个整数K满足K=a1x+b1=a2y+b2,其中x,y为自然数
很容易想到将等式移项,变为a1x+a2(y)=b2b1
那么很明显可以用扩欧来求出一组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)a1MODL(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   Iowa_Battleship  阅读(113)  评论(2编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示