首页 > 其他分享 >Solution - Atcoder ARC116C Multiple Sequences

Solution - Atcoder ARC116C Multiple Sequences

时间:2024-10-07 20:33:55浏览次数:1  
标签:lfloor Atcoder le frac int ll rfloor Sequences ARC116C

一个 \(\mathcal{O}(m^{\frac{3}{4}}\log m)\) 做法。

令 \(a_0 = 1\)。

对于倍数问题,考虑类似差分的思想,定义 \(b_i = \frac{a_i}{a_{i - 1}}(1\le i\le n)\),那么合法的 \(a\) 和 \(b\) 是双射的,就只需要考虑对 \(b\) 计数了。

考虑到因为有 \(\prod\limits_{i = 1}^n b_i\le m\),所以 \(\sum\limits_{i = 1}^n [b_i > 1]\le \lfloor\log_2 m\rfloor\),即 \(b_i\) 中大于 \(1\) 的个数不超过 \(\log_2 m\) 个。

那么就只需要考虑 \(b_i > 1\) 的方案,再考虑把这些值放进 \(b\) 中的方案数。

对于把这些值放进 \(b\) 中的方案数是比较好算的。
考虑选了 \(k\) 个 \(> 1\) 的数,方案实际上就是把这 \(k\) 个数放在 \(k\) 个位置上,其余的 \(n - k\) 个位置填成 \(1\),那么方案数就是 \(\binom{n}{k}\)。

考虑到 \(k\le \log_2 m\),所以 \(\binom{n}{k}\) 是可以直接 \(\mathcal{O}(k)\) 推的(\(\binom{n}{m}\times \frac{n - m}{m + 1} = \binom{n}{m + 1}\)),复杂度不用带 \(\mathcal{O}(n)\)。

接下来就是考虑求 \(b_i > 1\) 的方案数了。
那么要求乘积 \(\le m\),如果直接维护乘积 \(p\) 显然不太行。
此时考虑到因为有 \(xy\le m \iff x\le \lfloor\frac{m}{y}\rfloor\) 和 \(\lfloor\frac{\lfloor\frac{m}{x}\rfloor}{y}\rfloor = \lfloor\frac{m}{xy}\rfloor\),所以实际上只需要维护 \(\lfloor\frac{m}{p}\rfloor\) 的值。

这样的好处就很明显了,因为 \(\lfloor\frac{m}{p}\rfloor\) 只有 \(\mathcal{O}(\sqrt{m})\) 个值,明显需要求的位置数量变少了。

于是可以设 \(f_{q, i}\) 为 \(\lfloor\frac{m}{p}\rfloor = q\) 且已经选了 \(i\) 个数的方案数。
转移就考虑由 \(f_{q, i}\) 向 \(f_{\lfloor\frac{q}{w}\rfloor, i + 1}(1 < w \le q)\) 转移,即选了一个数 \(w\)。
初值就是 \(f_{m, 0} = 1\) 了,即一个不选。

发现这个转移其实也是可以用整除分块来优化的,这就不描述了。

时间复杂度分析同杜教筛一样,只是多带了个维护选的数量的 \(\lfloor\log_2 m\rfloor\) 项,时间复杂度 \(\mathcal{O}(m^{\frac{3}{4}}\log m)\)。

给出的代码实现是直接搜索的 \(b_i\not = 1\) 的方案,组合数的预处理也是 \(\mathcal{O}(n)\) 的,跑的还行,可以借助这份代码理解。

#include<bits/stdc++.h>
using ll = long long;
constexpr ll mod = 998244353;
inline ll qpow(ll a, ll b, ll v = 1) {
   while (b)
      b & 1 && ((v *= a) %= mod), b >>= 1, (a *= a) %= mod;
   return v;
}
const int maxn = 2e5 + 10;
ll fac[maxn], ifac[maxn];
inline ll binom(int n, int m) {return fac[n] * ifac[m] % mod * ifac[n - m] % mod;}
int n, m;
ll ans;
void dfs(int c, int val, ll f) {
   if (c > n)
      return ;
   (ans += f * binom(n, c)) %= mod;
   for (int l = 2, r; l <= val; l = r + 1) {
      r = val / (val / l);
      dfs(c + 1, val / l, f * (r - l + 1) % mod);
   }
}
int main() {
   scanf("%d%d", &n, &m);
   for (int i = fac[0] = 1; i <= n; i++) fac[i] = fac[i - 1] * i % mod;
   ifac[n] = qpow(fac[n], mod - 2);
   for (int i = n; i; i--) ifac[i - 1] = ifac[i] * i % mod;
   dfs(0, m, 1);
   printf("%lld\n", ans);
   return 0;
}

标签:lfloor,Atcoder,le,frac,int,ll,rfloor,Sequences,ARC116C
From: https://www.cnblogs.com/rizynvu/p/18450537

相关文章

  • AtCoder Beginner Contest 374
    ABC374A-Takahashisan2题目传送门代码(签到题)#include<cstdio>#include<cctype>#include<cstring>#include<cmath>#include<queue>usingnamespacestd;intiut(){ intans=0,f=1;charc=getchar(); while(!isdigit(c))f=(c==&......
  • AtCoder Beginner Contest 374
    省流版A.判断末三位即可B.逐位判断即可C.枚举所有分组情况即可D.枚举线段顺序、端点顺序即可E.二分答案,发现贵的机器数量不超过\(100\),枚举求最小花费看是否可行即可F.朴素DP,复杂度分析得到有效时刻不超过\(O(n^2)\)而非\(O(s_i)\),直接\(DP\)即可A-Takahashi......
  • ABC221G Jumping Sequences 题解
    JumpingSequences把移动的上下左右改成左上、左下、右上、右下(坐标轴旋转\(45\)°)。则最终目的地是\((A+B,A-B)\)。(以前移动的方式是\((\pmd_i,0),(0,\pmd_i)\)。现在每次移动的方式是\((\pmd_i,\pmd_i)\))则\(x,y\)两维可以分开考虑。目标:从\(d_1\simd_n\)中选......
  • 题解:CF1976D Invertible Bracket Sequences
    可以在cnblog中阅读。题意给一个合法括号序列,问有多少区间\([l,r]\),使得将区间内的每个括号翻转后,括号序列仍合法。分析十分套路地,我们将(看成\(+1\),将)看成\(-1\),则一个括号序列合法的充要条件是转换后的序列满足:前缀和任意位置非负;最后一项为\(0\)。考虑翻转......
  • AtCoder Beginner Contest 373
    省流版A.暴力即可B.求出字母位置,绝对值相加即可C.显然答案为两个数组的最大值的和D.注意直接BFS的点权范围不超过题目范围,直接BFS即可E.发现单调性,二分票数,用前缀和\(O(1)\)判断可行性即可F.朴素背包DP,相同重量的物品一起考虑,用优先队列求解\(l\)个相同重量物品最大......
  • Solution - Atcoder ARC157E XXYX Binary Tree
    考虑这个不存在\(\texttt{YY}\)的限制,与\(\texttt{XX}\)个数为变量的限制相比较,看起来\(\texttt{Y}\)就更特殊,于是考虑从\(\texttt{Y}\)的视角来分析问题。同时考虑到因为有\(A+B+C=n-1\),所以\(\texttt{XX}\)其实也不是很重要,因为只需要让\(\texttt{XY}\)和......
  • Solution - Atcoder ARC157D YY Garden
    考虑到因为有横轴数轴两部分的限制,不妨先固定下来一部分的限制再处理另一部分。对于这题来说横轴竖轴本质是相同的,于是不妨考虑固定横轴。如果知道了横轴的分割,那么对于竖轴上就可以根据分割情况知道合法的分割了。即考虑记\(f_i\)为考虑了竖轴的前\(i\)列,第\(i\)列为最......
  • AtCoder Beginner Contest 365
    A-LeapYear思路模拟即可;AC代码#include<bits/stdc++.h>#defineendl'\n'#defineintintlonglong#definepbpush_back#definebsbitsetusingnamespacestd;typedefpair<char,int>PCI;typedefpair<......
  • 题解:AtCoder Beginner Contest AT_abc373_d ABC373D Hidden Weights(格式美化版)
    题目传送门题目翻译给你一个NNN个点,MMM条边的有向图,其中边有边......
  • AtCoder Beginner Contest 365题解
    A-LeapYear按照题意模拟即可。codeB-SecondBest按照题意模拟即可。codeC-TransportationExpenses考虑当\(x\)增大时,\(\min(x,a_i)=x\)的项会越来越少。换言之,当\(x\)足够大时,\(ans=\suma_i\),若此时\(ans>M\)则说明无论补贴多少,这时答案都是一定的......