【LuoguP5171】Earthquake

本文介绍了一种计算特定不等式下非负整数解对数的方法。通过数学变形和巧妙的对称处理,文章提供了一个有效的算法实现,并附带源代码。此问题涉及数论中的经典技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题意

求满足如下不等式的非负整数 \(x,y\) 的对数
\[ax+by\leq c\]

Sol

a,b,c 都是非负的,那么先随便变个形:
\[y\leq\frac{c-ax}{b}\]

显然答案就是:
\[\sum_{x=0}^{\lfloor\frac{c}{a} \rfloor}\bigg(\lfloor \frac{c-ax}{b}\rfloor+1\bigg)\]

类欧板子题了,但是这个斜率居然是一个负数 ,不能直接套用以前的做法。
一开始想着先把这条直线往 \(x\) 轴对称然后向上平移,但是这样太麻烦了。
\(n=\lfloor \frac{c}{a}\rfloor\) ,直接把直线沿着 \(n/2\) 对称就好了,这样在下方的点不受影响,左上方的点也被对应到了右上方,并且整点依然是整点。

code:

#include<bits/stdc++.h>
using namespace std;
template<class T>inline void init(T&x){
    x=0;char ch=getchar();bool t=0;
    for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=1;
    for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);
    if(t) x=-x;return;
}typedef long long ll;
ll a,b,c;
inline ll gcd(ll a,ll b){return b? gcd(b,a%b):a;}
inline ll likegcd(ll n,ll a,ll b,ll c){
    if(!n) return b/c;if(!a) return b/c*(n+1);
    ll d=abs(gcd(gcd(a,b),c));
    if(d>1) a/=d,b/=d,c/=d;
    if(a>=c||b>=c) return b/c*(n+1)+a/c*(n+1)*n/2+likegcd(n,a%c,b%c,c);
    ll m=(a*n+b)/c;
    return n*m-likegcd(m-1,c,c-b-1,a);
}
int main()
{
    init(a),init(b),init(c);
    ll n=c/a;ll ans=n+1+likegcd(n,a,c-a*n,b);
    cout<<ans<<endl;
    return 0;
}

转载于:https://www.cnblogs.com/NeosKnight/p/10632938.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值