首页 > 其他分享 >Codeforces 1146D Frog Jumping

Codeforces 1146D Frog Jumping

时间:2024-05-10 17:33:39浏览次数:21  
标签:1146D frac int bmod Codeforces ge Jumping ib mx

首先根据裴蜀定理,能走到的点 \(x\) 肯定满足 \(\gcd(a, b) | x\)。
于是令 \(g = \gcd(a, b)\),可以考虑求解 \(\lfloor\frac{m}{g}\rfloor, \frac{a}{g}, \frac{b}{g}\),最后记得去判一下 \([g\lfloor\frac{m}{g}\rfloor, m]\) 这个区间,因为只有这个区间是不满(区间长度可能 \(< g\))的,其他的直接 \(\times g\) 即可。
接下来的求解都以新的规模来做。

考虑到 \(+ a\) 这个操作,这启发可以类似同余最短路的想法,记录到 \(\bmod a = p(0\le p < a)\) 的点,要走到这样的点至少答案都得是多少,记为 \(mx_p\)。
然后 \(mx_p\) 是可以递推的,考虑从 \(-ib\bmod p\) 推到 \(-(i + 1)b\bmod p\),那么这一步推过去肯定就需要 \(-b\) 了,考虑在维护一下当 \(-ib\bmod p\) 时此时推到的数 \(x\) 的值,那么肯定需要 \(x\ge b\),所以先加 \(a\) 加到 \(x\ge b\),再 \(-b\) 即可,其中还没 \(-b\) 时 \(x\) 的最大值就是可能的最大值,与 \(mx_{-ib\bmod p}\) 取 \(\max\) 后即是 \(mx_{-(i + 1)b\bmod p}\)。
即初始化 \(x = 0, mx_0 = 0, i = 0\),接下来若 \(x < b\),则一直 \(+ a\) 直到 \(x\ge b\),然后 \(mx_{-(i + 1)b\bmod p} \leftarrow \max\{mx_{-ib\bmod p}, x\}\),最后 \(x\leftarrow x - b\)。
当然能够证明其实 \(-ib\bmod p = x\),这因为如果不成立显然有 \(x\ge a\),那么到了上一步肯定再 \(x\ge b + a\),但是上一步若 \(x \ge b\) 就停止了操作,肯定 \(x\in [b, b + a)\),所以不成立。

那么要表示出 \(i\) 需要的最小值就是 \(\max\{i, mx_{i\bmod a}\}\)。
通过递推过程能够发现 \(mx_p\le a + b\),所以当 \(i\ge a + b\) 时肯定需要的最小值就是 \(i\)。

所以可以考虑暴力处理出 \(x\in [0, a + b]\) 范围内的 \(f(x)\),前缀和即可。
对于 \(x\in (a + b, m]\) 肯定有 \(f(x) = x + 1\),用一个等差数列求和即可。

时间复杂度 \(\mathcal{O}(a + b)\)。

#include<bits/stdc++.h>
using ll = long long;
const int maxV = 2e5 + 10;
int mxp[maxV];
int cnt[maxV];
int main() {
   int M, A, B;
   scanf("%d%d%d", &M, &A, &B);
   int g = std::__gcd(A, B);
   int m = M / g, a = A / g, b = B / g;
   for (int i = 0, p = 0, mx = 0; i < a; i++)
      mxp[p] = mx, p < b && (p += (b - p + a - 1) / a * a), mx = std::max(mx, p), p -= b;
   int n = std::min(m, a + b);
   for (int i = 0; i <= n; i++)
      cnt[std::max(i, mxp[i % a])]++;
   for (int i = 1; i <= n; i++)
      cnt[i] += cnt[i - 1];
   ll ans = 0;
   for (int i = 0; i <= n; i++)
      ans += 1ll * cnt[i] * g;
   if (m == n)
      ans -= 1ll * cnt[m] * ((m + 1) * g - 1 - M);
   else {
      int l = n + 1, r = m - 1;
      ans += 1ll * (l + r) * (r - l + 1) / 2ll * g;
      ans += 1ll * m * (M - m * g + 1);
      ans += M + 1 - (n + 1) * g;
   }
   printf("%lld\n", ans);
   return 0;
}

标签:1146D,frac,int,bmod,Codeforces,ge,Jumping,ib,mx
From: https://www.cnblogs.com/rizynvu/p/18184947

相关文章

  • CF1787H Codeforces Scoreboard
    CF1787HCodeforcesScoreboard校内测试的一道题,考试时根本没动。。题面考虑\(k\)比较大的放前面肯定优,然后修门挨着放也肯定优,所以先按\(k\)排个序,然后我们就只考虑每个门修不修。设计状态\(f[i][j]\)表示前\(i\)个点,有\(j\)个门取\(b-kt\),少送回去的最少......
  • CodeForces 1967D Long Way to be Non-decreasing 题解
    题意简述yzh喜欢单调不降序列。她有一个序列\(a\),最初为\(a_1,\ldots,a_n\),其中每个元素都在\([1,m]\)内。她希望使序列变得单调不降,为此,她有一个序列$b_1\ldotsb_m$,每个元素也在\([1,m]\)内。她可以进行若干次操作,一次操作定义为:选择一个集合\(S\subseteq......
  • Codeforces Round 942 (Div. 2) D2
    链接题目要求用数学一点的形式表达出来就是统计有多少a,b满足1.\(1\leqa\leqn,1\leqb\leqm\)2.\(\existsk\inN^*,使得b\timesgcd(a,b)=k\times(a+b)\)首先,把a和b改写,使得\(gcd(a,b)\)消失\(a=q*d,b=p*d\),则,\(gcd(a,b)=d\)条件二变为:\(p\timesd^2=k\times(q\t......
  • Codeforces Round 941 (Div. 2) Div 1 cf941 A-D
     A感觉A比较复杂啊,相比较B简单明了。way1只要有相同的一个数,它的数目大于等于k,那么它就可以进行一次操作,接下来可以再摸k-1个数,那么对于无法凑成k个数的数字来说,无论现在它有多少个数(>=1),加上这k-1个数,都能凑成数目>=k。同时,这个操作可以无限循环下去。所以这道题的出题设......
  • 『Solution』Codeforces 372D Choosing Subtree is Fun
    首先这个\(k\)的限制不是很好入手,考虑先从如果选取了区间\([l,r]\)来入手。那么此时连通块最小的\(siz\)就是把这些点拎出来建虚树对应在原树上的所有点。那么这个有个结论,考虑按\(\operatorname{dfn}\)序排序后的点为\(p_0\simp_{k-1}\),那么对应的最小\(sz\)就......
  • 『Solution』Codeforces 1970B Exact Neighbours
    Easy没什么启发性,直接考虑Medium。考虑到\(a_1=0\),那么\(1\)明显直接和自己配对就行,考虑分配到一个特殊的位置\((1,1)\)。接下来考虑如果还有\(a_i=0\),那么明显\(i\)也是和自己配对,此时因为这是无关紧要的就可以离特殊的\((1,1)\)尽量远一点,也就是让\(x\)坐......
  • Codeforces Round 943 (Div. 3)
    CodeforcesRound943(Div.3)A.Maximize?题意:给定x,求一个范围在[1,x)的数字y,内使得gcd(x,y)+y最大,输出任意的y思路:数据范围很小,暴力枚举即可voidsolve(){intx;cin>>x;inty=1,ma=0;for(inti=1;i<x;i++){intres=__gc......
  • Codeforces 1129E Legendary Tree
    考虑让选取的集合更加特殊,不妨就让\(S=\{x\}\)。那么这个时候能发现询问\((S=\{x\},T,v)\)得到的就是以\(x\)为根时\(v\)的子树内\(T\)中的点的数量。考虑定个根,不妨为\(1\),同时令\(S=\{1\}\)。那么询问\((\{1\},\{1,\cdotsn\}\backslash\{1,x\},x)......
  • Codeforces Round 943 (Div. 3)
    无伤但没速通,然后被hack两个题,直接从rk90掉到rk114514+了,我是真他妈的服了。特此纪念A暴力枚举秒了。B二分答案秒了C他妈脑子抽了,差一步完全整解。我们发现只要确定\(a_{\mathbf{1}}\)那么你直接不断加\(x_i\)就能求出\(a_i\),但是直接这么搞过不了样例,观察一下,然后直......
  • Codeforces 452F Permutation
    对于\(a,b,\frac{a+b}{2}\)肯定是需要固定下一些变量来考虑的。考虑固定下\(c=\frac{a+b}{2}\),考虑\(a,b\)。那么这样的\(a,b\)肯定满足\(a-c=b-c,a\not=b\),那么以\(c\)为中心,\(a,b\)就是对称的。用\(s_i=0,1\)来表示\(i\)是在\(c\)的......