P4213【模板】杜教筛

题面

https://www.luogu.org/problem/P4213

题解

#include<cstdio>
#include<iostream>
#include<cstring>
#pragma GCC optimize(2)
#define ri register int
#define maxn 2147483647
#define maxm 3000000
#define maxk 2000
#define LL long long

using namespace std;

int p[maxm],phi[maxm],miu[maxm],k[maxm],prime[maxm],cnt=0;
bool vis[maxm];
LL S1[maxm],S2[maxk];

LL SS1[maxm],SS2[maxk];
bool vis2[maxm];

int T,N;

void getS1() {
  phi[1]=1;
  for (ri i=2;i<maxm;i++) {
    if (p[i]==0) {
      k[i]=p[i]=prime[++cnt]=i;
      phi[i]=i-1;
    }
    for (ri j=1;j<=cnt && i*prime[j]<maxm;j++) {
      k[i*prime[j]]=p[i*prime[j]]=prime[j];
      phi[i*prime[j]]=phi[i]*phi[prime[j]];
      if (prime[j]==p[i]) {
        k[i*prime[j]]*=k[i];
        phi[i*prime[j]]=phi[i/k[i]]*phi[prime[j]*k[i]];
        if (k[i*prime[j]]==i*prime[j]) phi[i*prime[j]]=i*(prime[j]-1);
        break;
      }
    }
  }
  S1[0]=0;
  for (ri i=1;i<maxm;i++) S1[i]=S1[i-1]+phi[i];

  miu[1]=1;
  for (ri i=2;i<maxm;i++) {
    if (i==p[i]) miu[i]=-1;
    else if (k[i]==i) miu[i]=0;
    else miu[i]=miu[i/k[i]]*miu[k[i]];
  }
  SS1[0]=0;
  for (ri i=1;i<maxm;i++) SS1[i]=SS1[i-1]+miu[i];
}

LL S(int n) {
  if (n<maxm) return S1[n];
  ri x=N/n;
  if (x<maxk && vis[x]) return S2[x];
  vis[x]=true;
  LL &ans=S2[x];
  ans=(LL)n*(n+1)/2;
  for (ri i=2,j;i<=n;i=j+1) {
    j=n/(n/i);
    ans-=(j-i+1)*S(n/i);
  }
  return ans;
}

LL SS(int n) {
  if (n<maxm) return SS1[n];
  ri x=N/n;
  if (x<maxk && vis2[x]) return SS2[x];
  vis2[x]=true;
  LL &ans=SS2[x];
  ans=(LL)1;
  for (ri i=2,j;i<=n;i=j+1) {
    j=n/(n/i);
    ans-=(j-i+1)*SS(n/i);
  }
  return ans;
}

int main(){
  scanf("%d",&T);
  getS1();
  for (ri i=1;i<=T;i++) {
    scanf("%d",&N);
    memset(vis,0,sizeof(vis));
    memset(vis2,0,sizeof(vis2));
    printf("%lld %lld\n",S(N),SS(N));
  }
}

原文地址:https://www.cnblogs.com/shxnb666/p/11427186.html

时间: 2024-11-09 03:08:51

P4213【模板】杜教筛的相关文章

luoguP4213 [模板]杜教筛

https://www.luogu.org/problemnew/show/P4213 同 bzoj3944 考虑用杜教筛求出莫比乌斯函数前缀和,第二问随便过,第一问用莫比乌斯反演来做,中间的整除分块里的莫比乌斯前缀和刚好用第二问来做 杜教筛的时候先线性筛出前 N 个数的莫比乌斯函数前缀和,其余的用 map 记忆化搜索,实测 N 取 3670000 最佳(其实我只测了3次) #include <bits/stdc++.h> using namespace std; typedef unsign

洛谷P4213 Sum(杜教筛)

题目描述 给定一个正整数N(N\le2^{31}-1)N(N≤231−1) 求ans_1=\sum_{i=1}^n\phi(i),ans_2=\sum_{i=1}^n \mu(i)ans1?=∑i=1n??(i),ans2?=∑i=1n?μ(i) 输入输出格式 输入格式: 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 输出格式: 一共T行,每行两个用空格分隔的数ans1,ans2 输入输出样例 输入样例#1: 复制 6 1 2 8 13 30 2

[模板]杜教筛

用途 比线性更快($O(n^{\frac{2}{3}})$)地求积性函数的前缀和 前置知识:狄利克雷卷积 形如$h(n)=\sum\limits_{d|n}f(d)g(\frac{n}{d})$,则称$h(n)=f(x)*g(x)$ 如果f和g都是积性函数,则卷出的h也是积性函数 可以证明,狄利克雷卷积满足交换律.结合律.分配律 比较重要的卷积式子(抄的..): $$\mu*1=\varepsilon , \varepsilon(n)=[n=1]$$ $$\varphi*1=id , id(n)

P4213 【模板】杜教筛(Sum)

\(\color{#0066ff}{题 目 描 述}\) 给定一个正整数\(N(N\le2^{31}-1)\) 求 \(\begin{aligned} ans_1=\sum_{i=1}^n\varphi(i) \end{aligned}\) \(\begin{aligned} ans_2=\sum_{i=1}^n \mu(i) \end{aligned}\) \(\color{#0066ff}{输 入 格 式}\) 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N

P4213【模板】杜教筛(Sum)

思路:杜教筛 提交:\(2\)次 错因:\(\varphi(i)\)的前缀和用\(int\)存的 题解: 对于一类筛积性函数前缀和的问题,杜教筛可以以低于线性的时间复杂度来解决问题. 先要构造\(h=f*g\),并且\(h\)的前缀和易求,\(g\)的区间和易求. 具体地: \[\sum_{i=1}^{n}h(i)=\sum_{i=1}^{n}\sum_{d|i}g(d)\cdot f(\frac{i}{d})\] \[\sum_{i=1}^{n}h(i)=\sum_{d=1}^{n}g(d)\

【模板】杜教筛(Sum)

传送门 Description 给定一个正整数\(N(N\le2^{31}-1)\) 求 \[ans1=\sum_{i=1}^n \varphi(i)\] \[ans_2=\sum_{i=1}^n \mu(i)\] Solution 总算是写了一个不会\(TLE\)的杜教筛,不想用\(map\),因此上了一个很丑的\(Hash\)-- Code #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(

[模板][P3377]杜教筛

Description: 求 $ \sum_{i=1}^n \phi(i) ,\sum_{i=1}^n \mu(i)$ Hint: \(n<=10^{10}?\) Solution: 考虑积性函数 \(f,g,h?\) 及其前缀和 \(F,G,H?\) 其中 \(h=f*g?\) 首先 \(H(x)=\sum_{n=1}^xh(n)\) \(=\sum_{n=1}^x \sum_{d|n} f(d) g(\frac{n}{d})\) 枚举倍数转枚举因数 \(=\sum_{k=1}^x \sum_

CCPC 2019 网络赛 HDU huntian oy (杜教筛)

1005 huntian oy (HDU 6706) 题意: 令,有T次询问,求 f(n, a, b). 其中 T = 10^4,1 <= n,a,b <= 1e9,保证每次 a,b互质. 思路: 首先我们需要知道 公式: gcd(a^n - b^n, a^m - b^m) = a^(gcd(m,n)) - b^(gcd(m,n)) 由a,b互质,原式即为 f(n, a, b) = ∑∑ (i-j)*[(i,j)=1] = ∑ (i*∑ [(i, j)=1] ) - ∑∑ j*[(i, j)=

【数论】狄利克雷卷积及其快速计算方法及杜教筛

目录(假的 狄利克雷卷积基础知识 数论函数 狄利克雷卷积定义 狄利克雷卷积性质 常用卷积 卷积计算方法 最暴力的暴力 稍好的暴力 优美的暴力 莫比乌斯反演(待填坑) 杜教筛 经典杜教筛 第二种杜教筛 第三种杜教筛 背景 本人即将去CTS&APIO2019,由于一些特殊原因,发现自己数论突然变得很菜. 就决定在去的前一天,翻出来以前的数论学习资料看一看.翻到了czgj的校内狄利克雷卷积课件,发现其中提到了的任意数列\(f(n)\)和\(g(n)\)的狄利克雷卷积\((f*g)(n)\)(从1到n,

【bzoj 4176】 Lucas的数论 莫比乌斯反演(杜教筛)

Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 一行一个整数ans,表示答案模1000000007的值. Sample Input 2 Sample Output 8 HINT 对于100%的数据n <= 10^9. 题解: 解锁新技能:杜教筛. 再复习一下: 若$F(n)=\s