【BZOJ2987】Earthquake

来源:互联网 发布:淘宝联盟怎么注册账号 编辑:程序博客网 时间:2024/05/21 07:48

Description

给定a,b,c,求满足方程Ax+By<=C的非负整数解

A,B<=10^9.C<=Min(A,B)*10^9

Input

Output

Sample Input

3 4 13

Sample Output

12

HINT

Source

其实题目的表述有异议.意思是求解的个数.

对于某一个值为0的可以直接算

显然答案应当是

x=1ncaxb

以下就是类欧的主要思想:

我们可以轻易的把ax 换成 +axa<b
bc也可以将c转化为c<b

x=1nc+axb

=x=1nk[kbc+ax]

=knkbca+1

=knkbc+a1a+1

可以发现这变成了一个规模更小的问题
就可以递归求解了
复杂度是O(logn)

直接抄了学姐的公式来写题解感觉良心谴责max

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define LL long longusing namespace std;LL calc(LL n,LL a,LL b,LL c){    LL ret=0;    if (!n) return ret;    if (c<0)    {        LL t=(a-c-1)/a;        ret-=t*n;c+=t*a;    }    if (c/a>0||b/a>0)    {        ret+=c/a*n;ret+=b/a*n*(n+1)/2;        c%=a;b%=a;    }    LL newn=(b*n+c)/a;    ret+=newn*(n+1);ret-=calc(newn,b,a,b-c-1);    return ret;}int main(){    LL a,b,c,ans=0;cin>>a>>b>>c;    LL minn=(c-a)/b,tmp=(b+a-1)/a;    ans-=tmp*(minn+1)*minn/2;ans+=c/a+c/b+1;    cout<<ans+calc(minn,a,tmp*a-b,c);}
1 0
原创粉丝点击