推导
有时候需要快速计算如下式子(比如数据范围都是 109 )
f(a,b,c,n)=i=0∑n⌊cai+b⌋
g(a,b,c,n)=i=0∑ni⌊cai+b⌋
h(a,b,c,n)=i=0∑n⌊cai+b⌋2
先推导一下f(a,b,c,n),分两种情况
1.当a≥c或b≥c时,
f(a,b,c,n)=f(a%c,b%c,c,n)+2n(n+1)⌊ca⌋+(n+1)⌊cb⌋
2.当a<c且b<c时,令m=⌊can+b⌋
f(a,b,c,n)=i=0∑nj=1∑m[⌊cai+b⌋≥j]
f(a,b,c,n)=i=0∑nj=0∑m−1[⌊cai+b⌋≥j+1]
f(a,b,c,n)=i=0∑nj=0∑m−1[ai≥jc+c−b]
f(a,b,c,n)=i=0∑nj=0∑m−1[ai>jc+c−b−1]
f(a,b,c,n)=i=0∑nj=0∑m−1[i>ajc+c−b−1]
最后交换求和
f(a,b,c,n)=j=0∑m−1(n−⌊ajc+c−b−1⌋)
得到
f(a,b,c,n)=nm−f(c,c−b−1,a,m−1)
因为系数a,c变成了c,a%c,所以叫类欧几里得算法。
题目
给定a,b,c,求满足方程Ax+By<=C的非负整数解
ans=x=0∑⌊ac⌋⌊bc−ax⌋+1
负数再变形一下,可以看成把x从大到小遍历
ans=x=0∑⌊ac⌋⌊bc%a+ax⌋+1
在二维坐标系有两条直线y=bax,y=dcx。对于每一条直线,有一只蚂蚁从(1,0)出发,只能向上或向右走一格,并且蚂蚁一直都在直线下方,每次优先向上走,如果越过了直线就改为向右走。问对于这两个蚂蚁走过的点的交集大小。
斜率相等时交集点数无穷大。
对于直线y=bax,走到的点为ba(x−1)−1<y≤bax,x≥1
假设直线y=dcx斜率较小,那么交集为
ba(x−1)−1<y≤dcx,1≤x≤n
其中
n=⌊ad−bcd(a+b)⌋
最终要求的式子
x=0∑n−1⌊dcx+c⌋−x=0∑n−1⌊bax−1⌋
参考资料:
https://blog.csdn.net/WorldWide_D/article/details/54730588