类欧几里得算法简单形式

类欧几里得算法简单形式

类欧几里得算法,基础版,在 O(logn) 的时间复杂度下计算:

f(a,b,c,n)=i=0nai+bc

我们考虑先化简:

  1. ac,设 a=qc+r(0r<c),有:

f(a,b,c,n)=i=0nai+bc=i=0n(qc+r)i+bc=qn(n+1)2+i=0nri+bc

  1. bc,设 b=qc+r(0r<c),有:

f(a,b,c,n)=i=0nai+bc=i=0nai+qc+rc=(n+1)q+i=0nai+rc

经过上述步骤,可以化为 a<c,b<c 的情况:

f(a,b,c,n)=i=0nai+bc=i=0nj=0ai+bc11=j=0an+bc1i=0n[j<ai+bc]

而对于限制条件,有:

j<ai+bcj+1ai+bccj+cai+bcj+cbaicj+cb1a<i

所以,我们设 m=an+bc,则:

原式=j=0m1i=0n[cj+cb1a<i]=j=0m1(ncj+cb1a)=mni=0m1cj+cb1a=mnf(c,cb1,a,m1)

由此,原问题可以递归解决。

int f(int a,int b,int c,int n){
	if(n<0)return 0;
	int w=0;
	if(a>=c)w+=n*(n+1)*(a/c)/2,a%=c,w%=p;
	if(b>=c)w+=(n+1)*(b/c),b%=c,w%=p;
	int m=(a*n+b)/c;
	w+=n*m%p-f(c,c-b-1,a,m-1)%p;w%=p;
	return w;
} 

时间复杂度?我们只需注意函数的第一项和第三项,它们的关系如同求 gcd(a,b)=gcd(b,amodb) 一样,是 O(logn) 的,同时在 a,b 为斐波那契数列的相邻项时跑满。

posted @   spdarkle  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示