bzoj2987: Earthquake(类欧几里得)

传送门
题意简述:求满足 a x + b y + c ≤ 0 ax+by+c\le0 ax+by+c0的二元组 ( x , y ) (x,y) (x,y)对数。


思路:
类欧几里得算法模板题。
把式子变化一下变成:求满足 0 ≤ y ≤ − a x + c b 0\le y\le\frac{-ax+c}b 0ybax+c的二元组 ( x , y ) (x,y) (x,y)对数。
然后就变成求 ∑ i = 0 ⌊ c a ⌋ ⌊ − a x + c b ⌋ + 1 \sum_{i=0}^{\left\lfloor\frac ca\right\rfloor}\left\lfloor\frac{-ax+c}b\right\rfloor+1 i=0acbax+c+1
直接上类欧几里得即可,注意处理负数的情况。
不会类欧几里得算法的点这里
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
ll a,b,c;
inline ll solve(ll a,ll b,ll c,ll n){
	if(!n)return b/c;
	if(n==1)return (a+b)/c+b/c;
	if(c<0)return solve(-a,-b,-c,n);
	if(a>=c||b>=c)return solve(a%c,b%c,c,n)+n*(n+1)/2*(a/c)+(n+1)*(b/c);
	if(!a)return 0;
	if(a<0||b<0)return solve(a%c+c,b%c+c,c,n)+n*(n+1)/2*(a/c-1)+(n+1)*(b/c-1);
	ll m=(a*n+b)/c;
	return n*m-solve(c,-b+c-1,a,m-1);
}
int main(){
	cin>>a>>b>>c;
	cout<<c/a+1+solve(-a,c,b,c/a);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值