把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【BZOJ2987】Earthquake(类欧几里得算法)

点此看题面

大致题意: 求满足\(Ax+By\le C\)\(x,y\)的非负整数解个数。

推式子

显然由原式变形得到:

\[Ax+By\le C\Leftrightarrow Ax\le C-By\Leftrightarrow x\le\lfloor\frac{C-By}A\rfloor \]

于是发现,如果我们枚举\(y\),就会得到答案是这样一个式子:

\[\sum_{i=0}^{\lfloor\frac CB\rfloor}(\lfloor\frac{C-Bi}A\rfloor+1) \]

考虑到减号是一个比较烦人的东西,实际上此题中完全可以把\(C-Bi\)看作是\([0,C]\)中和\(C\)\(B\)同余的数,也就是由原式转而得到:

\[\sum_{i=0}^{\lfloor\frac CB\rfloor}(\lfloor\frac {(C\%B)+Bi}A\rfloor+1) \]

如果我们设:

\[f(n,A,B,C)=\sum_{i=0}^n(\lfloor\frac {Bi+C}A\rfloor+1) \]

不难发现,题目中要我们求的就是\(f(\lfloor\frac CB\rfloor,A,B,C\%B)\),且这显然可以当类欧几里得算法板子来做。

类欧几里得算法

\(B=0\)时:

\[f(n,a,b,c)=\sum_{i=0}^n(\lfloor\frac CA\rfloor+1)=(n+1)(\lfloor\frac CA\rfloor+1) \]

\(B\ge A\)\(C\ge A\)时:

\[\begin{align}f(n,a,b,c)&=\sum_{i=0}^n(\lfloor\frac{(B\%A)i+(C\%A)}A\rfloor+\lfloor\frac BA\rfloor i+\lfloor\frac CA\rfloor+1)\\&=f(n,A,B\%A,C\%A)+\frac{n(n+1)}2\lfloor\frac BA\rfloor+(n+1)\lfloor\frac CA\rfloor\end{align} \]

\(B<A,C<A\)时:

\(m=\lfloor\frac{Bn+C}A\rfloor\),即\(\lfloor\frac{Bi+C}A\rfloor\)能取到的最大值。

\[\begin{align}f(n,a,b,c)&=\sum_{i=0}^n\sum_{j=1}^m[\lfloor\frac{Bi+C}A\rfloor\ge j]+(n+1)\\&=\sum_{i=0}^n\sum_{j=0}^{m-1}[Bi+C+1>jA+A]+(n+1)\\&=\sum_{i=0}^n\sum_{j=0}^{m-1}[i>\lfloor\frac{jA+A-C-1}B\rfloor]+(n+1)\\&=\sum_{j=0}^{m-1}(n-\lfloor\frac{jA+A-C-1}B\rfloor)+(n+1)\\&=nm-f(m-1,B,A,A-C-1)+(n+m+1)\end{align} \]

于是递归求解即可,复杂度证明类似于欧几里得算法。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define LL long long
using namespace std;
I LL Get(Con LL& n,CI A,CI B,CI C)//类欧几里得算法
{
	if(!B) return (n+1)*(C/A+1);//B=0
	if(B>=A||C>=A) return Get(n,A,B%A,C%A)+n*(n+1)/2*(B/A)+(n+1)*(C/A);//B>=A或C>=A
	LL m=(B*n+C)/A;return n*m-Get(m-1,B,A,A-C-1)+n+m+1;//B<A,C<A
}
int main() 
{
	int A,B;LL C;return scanf("%d%d%lld",&A,&B,&C),printf("%lld",Get(C/B,A,B,C%B)),0;
}
posted @ 2020-06-03 17:36  TheLostWeak  阅读(145)  评论(0编辑  收藏  举报