首页 > 其他分享 >Solution - Atcoder Xmas2019D Sum of (-1)^f(n).md

Solution - Atcoder Xmas2019D Sum of (-1)^f(n).md

时间:2024-07-24 15:29:44浏览次数:7  
标签:mathbb Atcoder frac limits Sum Solution sum limB1 ll

对于 \(f(i) = (-1)^{\sum\limits_j c_j}(i = \prod\limits_j p_j^{c_j}(p_j\in \mathbb{P}))\),一个比较特殊的值就是在 \(i\in \mathbb{P}\) 时有 \(f(i) = -1\)。
于是考虑 Powerful Number 筛,构造积性函数 \(g\) 使得对于 \(i\in \mathbb{P}\) 有 \(g(p) = f(p)\) 且 \(g\) 易前缀求和。
那么就可以考虑构造 \(g = \mu\)。

接下来考虑得到 \(h = f / g\)。
那么能够发现因为有 \(f(1) = g(1) = h(1) = 1, f(i) = g(i) = -1(i\in \mathbb{P})\),于是可以知道 \(h(i) = 0(i\in \mathbb{P})\)。
又因为 \(h = f / g\) 也是一个积性函数,若对于 \(i = \prod\limits_j p_j^{c_j}(p_j\in \mathbb{P})\) 存在 \(c_j = 1\),那么有 \(h(i) = 0\)。
于是可以知道满足 \(h(i)\not = 0\) 的 \(i\) 可以表示为 \(a^2 b^3\) 的形式,通过积分可以知道对应的数量是 \(\mathcal{O}(\sqrt{n})\) 级别的。

然后来考虑求解 \(F(n) = \sum\limits_{i = 1}^n = f(i)\)。
就有 \(F(n) = \sum\limits_{i = 1}^n f(i) = \sum\limits_{i = 1}^n \sum\limits_{j | i} h(j)g(\frac{i}{j}) = \sum\limits_{j = 1}^n \sum\limits_{j | i, i\le n} h(j) g(\frac{i}{j}) = \sum\limits_{j = 1}^n h(j)G(\lfloor\frac{n}{j}\rfloor)\),其中 \(G(n) = \sum\limits_{i = 1}^n g(i)\)。
因为上文说到了 \(h(j)\not = 0\) 的数量是 \(O(\sqrt{n})\) 级别的,所以这部分的复杂度无需在意,直接搜索 \(h(j)\not = 0\) 的 \(j\) 即可。
于是重点到了求 \(G(\lfloor\frac{n}{x}\rfloor)\),因为 \(g = \mu\),所以只需要实现求 \(\lfloor\frac{n}{x}\rfloor\) 位置的 \(\mu\) 的前缀和,用杜教筛就可以了。

时间复杂度 \(\mathcal{O}(n^{\frac{2}{3}})\)。

#include<bits/stdc++.h>
using ll = long long;
using i128 = __int128_t;
const ll limn = 1e12, limB1 = (ll)pow(limn, 2.0 / 3), limB2 = (ll)pow(limn, 1.0 / 2);
ll n, B1, B2;
int pr[limB1 + 1], mn[limB1 + 1], m;
int mu[limB1 + 1]; ll sum1[limB1 + 1];
int leq[limB2 + 1], geq[limB2 + 1], tot;
ll val[limB2 * 2 + 1], sum[limB2 * 2 + 1];
inline int &id(ll x) {return x <= B2 ? leq[x] : geq[n / x];}
ll h[80];
ll dfs(int w, ll x, ll H) {
   if (! H)
      return 0;
   if (w > m || (i128)x * pr[w] > n || (i128)x * pr[w] * pr[w] > n)
      return H * sum[id(n / x)];
   ll ans = 0;
   for (int i = 0; x <= n; x *= pr[w], i++)
      ans += dfs(w + 1, x, H * h[i]);
   return ans;
}
int main() {
   scanf("%lld", &n), B1 = std::max(1ll, (ll)pow(n, 2.0 / 3)), B2 = (ll)pow(n, 1.0 / 2);
   mu[1] = 1ll;
   for (int i = 2; i <= B1; i++) {
      if (! mn[i])
         mn[i] = i, mu[i] = -1, pr[++m] = i;
      for (int j = 1; i * pr[j] <= B1 && j <= m; j++) {
         mu[i * pr[j]] = mn[i] == pr[j] ? 0ll : -mu[i], mn[i * pr[j]] = pr[j];
         if (mn[i] == pr[j])
            break;
      }
   }
   for (int i = 1; i <= B1; i++)
      sum1[i] = sum1[i - 1] + mu[i];
   for (ll l = 1, r = 0; l <= n; l = r + 1) {
      r = n / (n / l);
      val[id(n / l) = ++tot] = n / l;
   }
   for (int i = tot; i; i--) {
      ll x = val[i];
      if (x <= B1) {
         sum[i] = sum1[x];
         continue;
      }
      sum[i] = 1ll;
      for (ll l = 1, r = 0; l < x; l = r + 1) {
         r = std::min(x / (x / l), x - 1);
         sum[i] -= sum[id(x / l)] * (r - l + 1);
      }
   }
   h[0] = 1ll;
   for (ll i = 1, x = 2ll, f = -1; x <= n; i++, x <<= 1, f = -f)
      h[i] = f + h[i - 1];
   while (pr[m] > B2) m--;
   printf("%lld\n", dfs(1, 1ll, 1ll));
   return 0;
}

标签:mathbb,Atcoder,frac,limits,Sum,Solution,sum,limB1,ll
From: https://www.cnblogs.com/rizynvu/p/18320996

相关文章

  • Texstudio正反向搜索-配合sumatraPDF
    选项->设置->命令,然后找到外部pdf查看器,输入代码:"C:\Users\Kevin\AppData\Local\SumatraPDF\SumatraPDF.exe"-forward-search"?c:am.tex"@-inverse-search"C:\ProgramFiles\texstudio\texstudio.exe%%f-line%%l""?am.pdf"......
  • AtCoder Beginner Contest 363
    AtCoderBeginnerContest363前言只出了三题,被d卡住了,事实上e题应该对我而言更简单,没及时换题。A-PilingUp(atcoder.jp)思路代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.......
  • SMU Summer 2024 Contest Round 6
    1.TakandCards原题链接:http://162.14.124.219/contest/1010/problem/B设dp[i][j][k]是在前i个数中选j(j>=1)个数、其和为k的方案总数。第i个数有选与不选2种可能,由此得出转移方程dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k-a[i]](j>=1)查看代码#include<bits/stdc++.h>#de......
  • SUMA&国产海光平台服务器32DB16主板ECC内存对应表&故障内存定位
    32DB16主板内存映射关系,在ECC报错后,可参考LinuxHWError及EDAC等OS信息,定位出错内存所在位置。一、关于主板型号如何确认?方法一:可以使用以下命令在Linux系统进行查看,sudodmidecode-tbaseboard也可以使用cat/sys/class/dmi/id/board_vendorcat/sys/class/dmi/id/bo......
  • C. Mad MAD Sum(cf960)
    题意:定义MAD为数组中至少出现两次的最大数字,如果没有就是0.给定一个长度为n的数组a,sum=0,下面的过程将依次循环执行,直到a中的所有数字都变成0:设置sum+=∑ai;设bi=MAD(a1,a2..ai),ai=bi求过程结束后sum的值。分析:经历操作一次后的数组是非递减的,以后每次都是将数组向右移动,为了......
  • SMU Summer 2024 Contest Round 6
    AManyFormulas思路:二进制枚举voidsolve(){strings;cin>>s;intn=s.size();intm=pow(2,n-1);intans=0;for(inti=0;i<m;++i){intnow=0,sum=0;for(intj=0;j<n;++j){......
  • AtCoder Beginner Contest 363
    AtCoderBeginnerContest363PilingUp模拟题。点击查看代码#include<bits/stdc++.h>usingnamespacestd;inta;signedmain(){cin>>a;if(a%100!=0){a%=100;cout<<100-a;}else{cout<<100;}retur......
  • 计算机网络中的检验和(checksum)(包括计算文件的检验和附有c++代码)
    介绍:检验和(checksum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。它通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255.就要求其补码作为校验和。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。(此引用了检验和的百......
  • Python学习计划——2.3常用内置函数(len, max, min, sum, etc.)
    Python提供了许多内置函数,用于简化对数据结构的操作。以下是一些常用的内置函数及其详细说明。1.len()len()函数用于返回对象(如列表、元组、字符串、字典等)的长度(元素个数)。示例:#列表fruits=["apple","banana","cherry"]print(len(fruits))#输出:3#元组c......
  • Array Sum up increment. 1526, 3229
    1526.MinimumNumberofIncrementsonSubarraystoFormaTargetArrayYouaregivenanintegerarray target.Youhaveanintegerarray initial ofthesamesizeas target withallelementsinitiallyzeros.Inoneoperationyoucanchoose any subarray......