##Preface
欧几里得算法,就是辗转相除法。
gcd(i,j)=gcd(j,i%j)

##定义
定义函数
类欧几里得算法(部分)_数论

##推导一波
显然当类欧几里得算法(部分)_整除_02或者类欧几里得算法(部分)_整除_03时,类欧几里得算法(部分)_数论_04
类欧几里得算法(部分)_数论_05

若当a,b均小于c怎么办?
据大佬说转换成几何意义就是一条直线与x轴、y轴以及类欧几里得算法(部分)_辗转相除法_06围成的直角梯形中的整点个数

枚举纵线,
原式可化为
类欧几里得算法(部分)_类欧几里得算法_07就是上面式子i=n时的数

枚举每个数
类欧几里得算法(部分)_整除_08

尽量化成j=0
类欧几里得算法(部分)_欧几里得算法_09

大于等于下整除和不整除是一样的
类欧几里得算法(部分)_类欧几里得算法_10

变换一下
类欧几里得算法(部分)_整除_11

类欧几里得算法(部分)_数论_12
注意这里没有取整

大于等于,因为左边是整数
分子减1,符号变成大于

类欧几里得算法(部分)_辗转相除法_13

然后里面的sigma可以撤掉
类欧几里得算法(部分)_数论_14
类欧几里得算法(部分)_数论_15
所以类欧几里得算法(部分)_数论_16

如果只看a,c二维,变换是和欧几里得算法一样的
复杂度也和欧几里得算法一样

可以递归处理
边界条件是a=0,式子很明显。

g和h本蒟蒻并不会推,可以看看大佬的BLOG

##模版

LL fd(LL a,LL b,LL c,LL n)
{
if(a==0) return((b/c)*(n+1));
if(a>=c||b>=c) return fd(a%c,b%c,c,n)+(a/c)*n*(n+1)/2+(b/c)*(n+1);
LL m=(a*n+b)/c;
LL v=fd(c,c-b-1,a,m-1);
return n*m-v;
}