类欧几里得算法

博客围绕模板题展开,定义了f(a,b,c,n)、g(a,b,c,n)、h(a,b,c,n)三个函数,分别讨论了a=0、a≥c或b≥c、a<c且b<c三种情况下函数的计算方式,通过递归计算得出结果,并指出a、c两维每O(1)次至少减半,复杂度为O(logn)级别。

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

模板题

f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ g ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 h ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ f(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\ g(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\ h(a,b,c,n)=\sum_{i=0}^ni\left\lfloor\frac{ai+b}{c}\right\rfloor f(a,b,c,n)=i=0ncai+bg(a,b,c,n)=i=0ncai+b2h(a,b,c,n)=i=0nicai+b

  • a = 0 a=0 a=0

f ( a , b , c , n ) = ( n + 1 ) ⌊ b c ⌋ g ( a , b , c , n ) = ( n + 1 ) ⌊ b c ⌋ 2 h ( a , b , c , n ) = n ( n + 1 ) 2 ⌊ b c ⌋ f(a,b,c,n)=(n+1)\left\lfloor\frac{b}{c}\right\rfloor\\ g(a,b,c,n)=(n+1)\left\lfloor\frac{b}{c}\right\rfloor^2\\ h(a,b,c,n)=\frac{n(n+1)}2\left\lfloor\frac{b}{c}\right\rfloor f(a,b,c,n)=(n+1)cbg(a,b,c,n)=(n+1)cb2h(a,b,c,n)=2n(n+1)cb

  • a ≥ c a\geq c ac b ≥ c b\geq c bc

a ′ = a m o d    c , b ′ = b m o d    c a'=a\mod c,b'=b\mod c a=amodc,b=bmodc

f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ = ∑ i = 0 n ( ⌊ a c ⌋ i + ⌊ b c ⌋ + ⌊ a ′ i + b ′ c ⌋ ) = n ( n + 1 ) 2 ⌊ a c ⌋ + ( n + 1 ) ⌊ b c ⌋ + f ( a ′ , b ′ , c , n ) f(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\ =\sum_{i=0}^n\left(\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{a'i+b'}{c}\right\rfloor\right)\\ =\frac{n(n+1)}2\left\lfloor\frac{a}{c}\right\rfloor+\textcolor{red}{(n+1)}\left\lfloor\frac{b}{c}\right\rfloor+f(a',b',c,n) f(a,b,c,n)=i=0ncai+b=i=0n(cai+cb+cai+b)=2n(n+1)ca+(n+1)cb+f(a,b,c,n)
g ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 = ∑ i = 0 n ( ⌊ a c ⌋ i + ⌊ b c ⌋ + ⌊ a ′ i + b ′ c ⌋ ) 2 = ∑ i = 0 n ( ⌊ a c ⌋ 2 i 2 + ⌊ b c ⌋ 2 + ⌊ a ′ i + b ′ c ⌋ 2 + 2 i ⌊ a c ⌋ ⌊ b c ⌋ + 2 i ⌊ a c ⌋ ⌊ a ′ i + b ′ c ⌋ + 2 ⌊ b c ⌋ ⌊ a ′ i + b ′ c ⌋ ) = n ( n + 1 ) ( 2 n + 1 ) 6 ⌊ a c ⌋ 2 + ( n + 1 ) ⌊ b c ⌋ 2 + g ( a ′ , b ′ , c , n ) + n ( n + 1 ) ⌊ a c ⌋ ⌊ b c ⌋ + 2 ⌊ a c ⌋ h ( a ′ , b ′ , c , n ) + 2 ⌊ b c ⌋ f ( a ′ , b ′ , c , n ) g(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\ =\sum_{i=0}^n\left(\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{a'i+b'}{c}\right\rfloor\right)^2\\ =\sum_{i=0}^n\left(\left\lfloor\frac{a}{c}\right\rfloor^2i^2+\left\lfloor\frac{b}{c}\right\rfloor^2+\left\lfloor\frac{a'i+b'}{c}\right\rfloor^2+2i\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor+2i\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{a'i+b'}{c}\right\rfloor+2\left\lfloor\frac{b}{c}\right\rfloor\left\lfloor\frac{a'i+b'}{c}\right\rfloor \right)\\ =\frac{n(n+1)(2n+1)}{6}\left\lfloor\frac{a}{c}\right\rfloor^2+\textcolor{red}{(n+1)}\left\lfloor\frac{b}{c}\right\rfloor^2+g(a',b',c,n)+n(n+1)\left\lfloor\frac{a}{c}\right\rfloor\left\lfloor\frac{b}{c}\right\rfloor+2\left\lfloor\frac{a}{c}\right\rfloor h(a',b',c,n)+2\left\lfloor\frac{b}{c}\right\rfloor f(a',b',c,n) g(a,b,c,n)=i=0ncai+b2=i=0n(cai+cb+cai+b)2=i=0n(ca2i2+cb2+cai+b2+2icacb+2icacai+b+2cbcai+b)=6n(n+1)(2n+1)ca2+(n+1)cb2+g(a,b,c,n)+n(n+1)cacb+2cah(a,b,c,n)+2cbf(a,b,c,n)
h ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ = ∑ i = 0 n i ( ⌊ a c ⌋ i + ⌊ b c ⌋ + ⌊ a ′ i + b ′ c ⌋ ) = n ( n + 1 ) ( 2 n + 1 ) 6 ⌊ a c ⌋ + n ( n + 1 ) 2 ⌊ b c ⌋ + h ( a ′ , b ′ , c , n ) h(a,b,c,n)=\sum_{i=0}^ni\left\lfloor\frac{ai+b}{c}\right\rfloor\\ =\sum_{i=0}^ni\left(\left\lfloor\frac{a}{c}\right\rfloor i+\left\lfloor\frac{b}{c}\right\rfloor+\left\lfloor\frac{a'i+b'}{c}\right\rfloor\right)\\ =\frac{n(n+1)(2n+1)}6 \left\lfloor\frac{a}{c}\right\rfloor+\frac {n(n+1)}2\left\lfloor\frac{b}{c}\right\rfloor+h(a',b',c,n) h(a,b,c,n)=i=0nicai+b=i=0ni(cai+cb+cai+b)=6n(n+1)(2n+1)ca+2n(n+1)cb+h(a,b,c,n)

  • a < c a<c a<c b < c b<c b<c

m = ⌊ a n + b c ⌋ m=\left\lfloor\frac{an+b}{c}\right\rfloor m=can+b

f ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ = ∑ i = 0 n ∑ j = 1 m [ j ≤ ⌊ a i + b c ⌋ ] = ∑ i = 0 n ∑ j = 1 m [ j ≤ a i + b c ] = ∑ i = 0 n ∑ j = 1 m [ c j ≤ a i + b ] = ∑ i = 0 n ∑ j = 0 m − 1 [ c j + c ≤ a i + b ] = ∑ i = 0 n ∑ j = 0 m − 1 [ c j + c − 1 < a i + b ] = ∑ j = 0 m − 1 ∑ i = 0 n [ i > c j + c − b − 1 a ] = ∑ j = 0 m − 1 ( n + 1 − ∑ i = 0 n [ i ≤ c j + c − b − 1 a ] ) = ∑ j = 0 m − 1 ( n − ∑ i = 1 n [ i ≤ c j + c − b − 1 a ] ) = ∑ j = 0 m − 1 ( n − ⌊ c j + c − b − 1 a ⌋ ) = n m − f ( c , c − b − 1 , a , m − 1 ) f(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\\ =\sum_{i=0}^n\sum_{\textcolor{red}{j=1}}^m\left[j\leq \left\lfloor\frac{ai+b}{c}\right\rfloor\right]\\ =\sum_{i=0}^n\sum_{j=1}^m\left[j\leq \frac{ai+b}{c}\right]\\ =\sum_{i=0}^n\sum_{j=1}^m\left[cj\leq ai+b\right]\\ =\sum_{i=0}^n\sum_{\textcolor{blue}{j=0}}^{\textcolor{blue}{m-1}}\left[cj+c\leq ai+b\right]\\ =\sum_{i=0}^n\sum_{j=0}^{m-1}\left[cj+c-1< ai+b\right]\\ =\sum_{j=0}^{m-1}\sum_{i=0}^n\left[i>\frac{cj+c-b-1}{a}\right]\\ =\sum_{j=0}^{m-1}\left(n+1-\sum_{i=\textcolor{red}0}^n\left[i\leq \frac{cj+c-b-1}{a}\right]\right)\\ =\sum_{j=0}^{m-1}\left(n-\sum_{i=\textcolor{blue}1}^n\left[i\leq \frac{cj+c-b-1}{a}\right]\right)\\ =\sum_{j=0}^{m-1}\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)\\ =nm-f(c,c-b-1,a,m-1) f(a,b,c,n)=i=0ncai+b=i=0nj=1m[jcai+b]=i=0nj=1m[jcai+b]=i=0nj=1m[cjai+b]=i=0nj=0m1[cj+cai+b]=i=0nj=0m1[cj+c1<ai+b]=j=0m1i=0n[i>acj+cb1]=j=0m1(n+1i=0n[iacj+cb1])=j=0m1(ni=1n[iacj+cb1])=j=0m1(nacj+cb1)=nmf(c,cb1,a,m1)

剩下两个主体类似,故略去了一些中间步骤。

首先有: n 2 = 2 ∑ i = 1 n i − n n^2=2\sum_{i=1}^n i-n n2=2i=1nin

g ( a , b , c , n ) = ∑ i = 0 n ⌊ a i + b c ⌋ 2 = ∑ i = 0 n ( 2 ∑ j = 1 m [ j ≤ ⌊ a i + b c ⌋ ] j − ⌊ a i + b c ⌋ ) = 2 ∑ i = 0 n ∑ j = 0 m − 1 [ c j + c − 1 < a i + b ] ( j + 1 ) − f ( a , b , c , n ) = 2 ∑ j = 0 m − 1 ( j + 1 ) ( ∑ i = 0 n [ i > c j + c − b − 1 a ] ) − f ( a , b , c , n ) = 2 ∑ j = 0 m − 1 ( j + 1 ) ( n − ⌊ c j + c − b − 1 a ⌋ ) − f ( a , b , c , n ) = n m ( m + 1 ) − 2 h ( c , c − b − 1 , a , m − 1 ) − 2 f ( c , c − b − 1 , a , m − 1 ) − f ( a , b , c , n ) g(a,b,c,n)=\sum_{i=0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor^2\\ =\sum_{i=0}^n\left(2\sum_{j=1}^m\left[j\leq \left\lfloor\frac{ai+b}{c}\right\rfloor\right]j-\left\lfloor\frac{ai+b}{c}\right\rfloor\right)\\ =2\sum_{i=0}^n\sum_{j=0}^{m-1}\left[cj+c-1<ai+b\right]\textcolor{red}{(j+1)}-f(a,b,c,n)\\ =2\sum_{j=0}^{m-1}(j+1)\left(\sum_{i=0}^n\left[i>\frac{cj+c-b-1}{a}\right]\right)-f(a,b,c,n)\\ =2\sum_{j=0}^{m-1}(j+1)\left(n-\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\right)-f(a,b,c,n)\\ =nm(m+1)-2h(c,c-b-1,a,m-1)-2f(c,c-b-1,a,m-1)-f(a,b,c,n) g(a,b,c,n)=i=0ncai+b2=i=0n(2j=1m[jcai+b]jcai+b)=2i=0nj=0m1[cj+c1<ai+b](j+1)f(a,b,c,n)=2j=0m1(j+1)(i=0n[i>acj+cb1])f(a,b,c,n)=2j=0m1(j+1)(nacj+cb1)f(a,b,c,n)=nm(m+1)2h(c,cb1,a,m1)2f(c,cb1,a,m1)f(a,b,c,n)

h ( a , b , c , n ) = ∑ i = 0 n i ⌊ a i + b c ⌋ = ∑ i = 0 n i ∑ j = 1 m [ j ≤ ⌊ a i + b c ⌋ ] = ∑ i = 0 n i ∑ j = 0 m − 1 [ c j + c − 1 < a i + b ] = ∑ j = 0 m − 1 ∑ i = 0 n i [ c j + c − 1 < a i + b ] = ∑ j = 0 m − 1 ( n ( n + 1 ) 2 − 1 2 ⌊ c j + c − b − 1 a ⌋ ( ⌊ c j + c − b − 1 a ⌋ + 1 ) ) = 1 2 ( m n ( n + 1 ) − g ( c , c − b − 1 , a , m − 1 ) − f ( c , c − b − 1 , a , m − 1 ) ) h(a,b,c,n)=\sum_{i=0}^ni\left\lfloor\frac{ai+b}{c}\right\rfloor\\ =\sum_{i=0}^ni\sum_{j=1}^m\left[j\leq \left\lfloor\frac{ai+b}{c}\right\rfloor\right]\\ =\sum_{i=0}^ni\sum_{j=0}^{m-1}\left[cj+c-1<ai+b\right]\\ =\sum_{j=0}^{m-1}\sum_{i=0}^n i\left[cj+c-1<ai+b\right]\\ =\sum_{j=0}^{m-1}\left(\frac{n(n+1)}2-\frac 12\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor\left(\left\lfloor\frac{cj+c-b-1}{a}\right\rfloor+1\right)\right)\\ =\frac 12\left(mn(n+1)-g(c,c-b-1,a,m-1)-f(c,c-b-1,a,m-1)\right) h(a,b,c,n)=i=0nicai+b=i=0nij=1m[jcai+b]=i=0nij=0m1[cj+c1<ai+b]=j=0m1i=0ni[cj+c1<ai+b]=j=0m1(2n(n+1)21acj+cb1(acj+cb1+1))=21(mn(n+1)g(c,cb1,a,m1)f(c,cb1,a,m1))

递归算即可。 a , c a,c a,c 两维每 O ( 1 ) \Omicron(1) O(1) 次至少减半,所以复杂度是 O ( log ⁡ n ) \Omicron(\log n) O(logn) 级别的。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 10000005
using namespace std;
inline int read()
{
	int ans=0;
	char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
const int MOD=998244353,INV2=(MOD+1)/2,INV6=(MOD+1)/6;
typedef long long ll;
struct node{int f,g,h;inline node(const int& f=0,const int& g=0,const int& h=0):f(f),g(g),h(h){}};
node query(int n,int a,int b,int c)
{
	if (!a) return node((n+1ll)*(b/c)%MOD,(n+1ll)*(b/c)%MOD*(b/c)%MOD,n*(n+1ll)/2%MOD*(b/c)%MOD);
	if (a>=c||b>=c)
	{
		node t=query(n,a%c,b%c,c);
		return node(
		(n*(n+1ll)/2%MOD*(a/c)%MOD+(n+1ll)*(b/c)%MOD+t.f)%MOD,
		(n*(n+1ll)%MOD*(2ll*n+1)%MOD*INV6%MOD*(a/c)%MOD*(a/c)%MOD+(n+1ll)*(b/c)%MOD*(b/c)%MOD+t.g+n*(n+1ll)%MOD*(a/c)%MOD*(b/c)%MOD+2ll*(a/c)%MOD*t.h%MOD+2ll*(b/c)%MOD*t.f%MOD)%MOD,
		(n*(n+1ll)%MOD*(2ll*n+1)%MOD*INV6%MOD*(a/c)%MOD+n*(n+1ll)/2%MOD*(b/c)%MOD+t.h)%MOD
		);
	}	
	int m=((ll)a*n+b)/c;
	node t=query(m-1,c,c-b-1,a),ans;
	ans.f=((ll)n*m%MOD+MOD-t.f)%MOD;
	ans.g=(m*(m+1ll)%MOD*n%MOD+MOD-(2ll*t.h%MOD+2ll*t.f%MOD+ans.f)%MOD)%MOD;
	ans.h=(n*(n+1ll)%MOD*m%MOD+MOD-(t.f+t.g)%MOD)*INV2%MOD;
	return ans;
}
int main()
{
	for (int T=read();T;T--)
	{
		int n,a,b,c;
		n=read(),a=read(),b=read(),c=read();
		node ans=query(n,a,b,c);
		printf("%d %d %d\n",ans.f,ans.g,ans.h);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值