arc111E Simple Math 3

31 篇文章 0 订阅
14 篇文章 0 订阅

Description

Solution

  • 如果 i ( B − C ) + 1 ≥ D i(B-C)+1\ge D i(BC)+1D就一定有,那么接下来要求
    ∑ i = 1 l i m [ C i + A D − B i + A − 1 D = 1 ] = ∑ i = 1 l i m C i + A D − B i + A − 1 D \sum_{i=1}^{lim}[\frac{Ci+A}{D}-\frac{Bi+A-1}{D}=1]\\ =\sum_{i=1}^{lim}\frac{Ci+A}{D}-\frac{Bi+A-1}{D} i=1lim[DCi+ADBi+A1=1]=i=1limDCi+ADBi+A1
    (下取整)
  • 这怎么做啊?
  • “这不是类欧板题吗?”
  • “对哦!这么水!”。。。“但是我不会类欧呀!Orz”
  • 所以记录一下这个板题。

类欧几里得

  • 大体思路就是看作一个直线 y = a x + b c y=\frac{ax+b}{c} y=cax+b下方整数点的个数。
  • 先把 c c c整除的部分快速算出,即a%c,b%c。
  • 然后剩下一个三角形,枚举 x x x不好,我们枚举 y y y,然后推导亿下。
  • 参考这里的式子。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
 
int T;
ll A,B,C,D;
 
ll f(ll a,ll b,ll c,ll n){
	if (a>=c||b>=c) return f(a%c,b%c,c,n)+(a/c)*(n+1)*n/2+(b/c)*(n+1);
	if (a==0) return 0;
	return (a*n+b)/c*n-f(c,c-b-1,a,(a*n+b)/c-1);
}
 
int main(){
	scanf("%d",&T);
	while (T--){
		scanf("%lld%lld%lld%lld",&A,&B,&C,&D);
		ll k=(D-1+C-B-1)/(C-B)-1;
		ll ans=f(C,A,D,k)-f(B,A-1,D,k);
		printf("%lld\n",k-ans);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值