首页 > 其他分享 >Atcoder ARC090F Number of Digits

Atcoder ARC090F Number of Digits

时间:2024-07-03 14:46:30浏览次数:20  
标签:Digits Atcoder frac 10 int ll times ARC090F ge

记 \(n\) 为题面的 \(S\)。

能发现对于 \(f(l) = 8\),共有 \(9\times 10^7\) 个数。
此时就已经有 \(8\times 9\times 10^7 > 10^8 = n_{\max}\) 了,就说明不存在 \(f \ge 8\) 的情况,还满足这部分对应的数能全被选满。

所以可以知道对于 \(f(l)\ge 8\) 的情况,只存在 \(f(r) - f(l) = 0 \operatorname{or} 1\) 的情况。

对于 \(f(l)\le 7\) 的情况。
能发现 \(r\) 的上界是 \(10^7 + \frac{10^8}{8}\),所以这部分直接双指针就行了。

接下来考虑 \(f(l)\ge 8, f(r) - f(l) = 1\) 的情况。
考虑令 \(f(l)\) 选了 \(x\) 个,\(f(r) = f(l) + 1\) 选了 \(y\) 个。
需要先声明的是,在这个位置先不考虑 \(x, y > 0\) 的限制,而认为 \(y\) 可以为 \(0\),关于这部分将会在后面提到。
那么就能得到 \((x + y)f(l) + y = n\)。
然后这里以 \(x + y\) 为主元,能发现对于固定的 \(x + y\),其对应的 \(f(l)\) 和 \(x, y\) 都只有 \(1\) 个,就是 \(\begin{cases}y = n\bmod (x + y)\\ x = (x + y) - y\\ f(l) = \frac{n - y}{x + y}\end{cases}\)。

于是转而去考虑 \(x + y\) 能有多少种可能。
这是好算的,因为 \(x + y\le \frac{n}{f(l)}\),而因为 \(f(l)\ge 8\),所以 \(x + y\le \frac{n}{8}\),对应的就有 \(\lfloor \frac{n}{8} \rfloor\) 种选法。

最后来考虑 \(f(l)\ge 8, f(r) - f(l) = 0\) 的情况。
这时候就已经确定了 \(f(l)\) 了,就相当于是已经知道需要的个数 \(x\) 了。
那么显然答案就为 \(9\times 10^{f(l) - 1} - x + 1\),但注意到,在前文的时候提到了误给 \(y = 0\) 时加了 \(1\) 的贡献,而其对应的应该就是这种 \(f(r) - f(l) = 0\) 的情况,所以实际算贡献的时候应该算为 \(9\times 10^{f(l) - 1} - x\)。
这部分可以 \(\mathcal{O}(\sqrt{n} + d(n)\log n)\)。

时间复杂度 \(\mathcal{O}(\frac{n}{b} + \sqrt{n} + d(n)\log n)\),其中 \(B = 8\),\(d(n)\) 表示 \(n\) 的因子个数。

#include<bits/stdc++.h>
using ll = long long;
constexpr ll mod = 1e9 + 7;
inline ll qpow(ll a, ll b, ll v = 1) {
   while (b)
      b & 1 && (v = v * a % mod), b >>= 1, a = a * a % mod;
   return v;
}
ll ans;
const int limn = (int)1e7 + (int)1e8 / 8, R = (int)1e7;
int f[limn + 10];
int main() {
   for (int i = 1, l = 1, r = 10; i <= 8; i++, r = std::min(l * 10, limn))
      while (l < r) f[l++] = i;
   int n; scanf("%d", &n);
   for (int i = 1, j = 0, sum = 0; f[i] <= n && i < R; i++) {
      while (sum + f[j + 1] <= n) sum += f[++j];
      if (sum == n) (++ans) %= mod;
      sum -= f[i];
   }
   (ans += n / 8) %= mod;
   auto calc = [&](int fx) {
      int l = n / fx;
      ll len = 9ll * qpow(10, fx - 1) % mod;
      (ans += mod + len - l) %= mod;
   };
   for (int i = 1; i * i <= n; i++) if (n % i == 0) {
      if (i >= 8) calc(i);
      if (n / i >= 8 && i != n / i) calc(n / i);
   }
   printf("%lld\n", ans);
   return 0;
}

标签:Digits,Atcoder,frac,10,int,ll,times,ARC090F,ge
From: https://www.cnblogs.com/rizynvu/p/18281509

相关文章

  • AtCoder Beginner Contest 359 (A ~F)
    A-CountTakahashiQuestion:给你n个单词,要么是Takahashi,要么是Aoki;输出有几个Takahashi即可。Code:#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineintlonglongtypedeflonglongll;typedefunsignedlonglongull;typedefpair<......
  • Atcoder ABC 360 全题解
    致歉对不起,我不应该在全题解的编写上咕咕咕两个月,导致流量大量流失。我知错了,下次还犯。AB无C考虑一个箱子里的所有球,我们需要把这些球放进互不相同的一些箱子里。然而我们可以留一个球在箱子里,显然留重量最大的最好,所以答案就是$\sum_{i=1}^{N}W_i$减去每个箱子里的最......
  • AtCoder Beginner Contest 360
    A-AHealthyBreakfast(abc360A)题目大意给定一个字符串包含RMS,问R是否在S的左边。解题思路比较R和S的下标,谁小即谁在左边。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);......
  • AtCoder Beginner Contest 359
    https://atcoder.jp/contests/abc359/tasksA-CountTakahashivoidsolve(){ intn; cin>>n; intans=0; while(n--){ strings; cin>>s; if(s=="Takahashi"){ ans++; } } cout<<ans<<endl;}B-......
  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359(3/6)A-CountTakahashiProblemStatementYouaregivenNNNstrings.Thei......
  • AtCoder Beginner Contest 359
    A-CountTakahashi(abc359A)题目大意给定\(n\)个字符串,问有多少个字符串是Takahashi解题思路注意判断比较即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359)
    A-CountTakahashi(abc359A)解题思路遍历判断即可神奇的代码#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<map>#include<set>#include<cstring>usingnamespacestd;#defineendl'\n......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题
    点我看题A-CountTakahashi没啥好说的点击查看代码#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<n;++i)#definerepn(i,n)for(inti=1;i<=n;++i)#defineLLlonglong#definefifirst#definesesecond#definepbpush_back#definemprmake_pair......
  • AtCoder Beginner Contest 359 解题报告
    AtCoderBeginnerContest359吐槽:A-F还算正常,G题你tm给我放了个出过的板子(ABC340G)是几个意思啊???ASimulate.#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineendl'\n'#definePBemplace_back#definePPBpop_back#defineMPmake_pai......
  • AtCoder ABC 358
    比赛链接A-WelcometoAtCoderLandAC_Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){strings,t;cin>>s>>t;if(s=="AtCoder"&&t=="Land")co......