BZOJ2987: Earthquake【类欧几里得】

2987: Earthquake

将式子移项得到 y ≤ − A x + C B y\le \frac{-Ax+C}{B} yBAx+C

答案就是 ∑ x = 0 n [ − A x + C B + 1 ] \sum_{x=0}^{n} [\frac{-Ax+C}{B}+1] x=0n[BAx+C+1]

f ( n , A , B , C ) = ∑ x = 0 n [ − A x + C B + 1 ] f(n,A,B,C)=\sum_{x=0}^{n} [\frac{-Ax+C}{B}+1] f(n,A,B,C)=x=0n[BAx+C+1]

B ≤ A B \le A BA|| B ≤ C B \le C BC

f ( n , A , B , C ) = f ( n , A % B , B , C % B ) + [ A / B ] ( n + 1 ) n 2 + [ C / B ] ( n + 1 ) f(n,A,B,C)=f(n,A\%B,B,C\%B)+[A/B]\frac{(n+1)n}{2}+[C/B](n+1) f(n,A,B,C)=f(n,A%B,B,C%B)+[A/B]2(n+1)n+[C/B](n+1)

C ≤ 0 C\le 0 C0|| A ≤ 0 A \le 0 A0

f ( n , A , B , C ) = f ( n , A % B + B , B , C % B + B ) + [ A / B − 1 ] ( n + 1 ) n 2 + [ C / B ] ( n + 1 ) f(n,A,B,C)=f(n,A\%B+B,B,C\%B+B)+[A/B-1]\frac{(n+1)n}{2}+[C/B](n+1) f(n,A,B,C)=f(n,A%B+B,B,C%B+B)+[A/B1]2(n+1)n+[C/B](n+1)

#include<cstdio>
using namespace std;
typedef long long LL;
LL a,b,c,n;
LL Solve(LL n,LL A,LL B,LL C){
	if(!B) return 0;
	if(A<0||C<0) return (A/B-1)*n*(n+1)/2+(C/B-1)*(n+1)+Solve(n,A%B+B,B,C%B+B);
	if(A>=B||C>=B) return A/B*n*(n+1)/2+C/B*(n+1)+Solve(n,A%B,B,C%B);	
	int kmax=(A*n+C)/B;
	return n*kmax-Solve(kmax-1,B,A,B-C-1);
}
int main(){
	scanf("%lld%lld%lld",&a,&b,&c);
	printf("%lld\n",Solve(c/a,-a,b,c+b));
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值