AT_abc334_b

· · 题解

最难了,我切了很久啊。换了很多种方法。

link。

核心代码:

int a,m,l,r;
cin >> a >>  m >> l >> r;
l-=a,r-=a;
if(l>0) cout<<(r/m-l/m+(l%m==0));
else if(r>0) cout<<(r/m+(-l)/m+1);
else cout<<((-l)/m-(-r)/m+((-r)%m==0));

我们可以通过取模的性质。然后知道一个数模 m 等于 a 模 m 的地方有树。首先我们不妨先将 a 的位置看成 0 点。我们可以抽象的理解,利用 m 分了很多个区间,每一个区间都是长度为 m,然后算出 l 和 r 分别属于什么区间,然后两个区间编号一减,其实就是他们中间树的个数。如果左端点在树上,还要再加一。因为涉及到正负性的关系。所以需要稍微分类讨论一下,然后注意细节即可。罚时3次。

博客园,AtCoder 题解复盘集合。