luoguP4213 [模板]杜教筛

https://www.luogu.org/problemnew/show/P4213

同 bzoj3944

考虑用杜教筛求出莫比乌斯函数前缀和,第二问随便过,第一问用莫比乌斯反演来做,中间的整除分块里的莫比乌斯前缀和刚好用第二问来做

杜教筛的时候先线性筛出前 N 个数的莫比乌斯函数前缀和,其余的用 map 记忆化搜索,实测 N 取 3670000 最佳(其实我只测了3次)

#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;
typedef long long ll;

template <typename _T>
inline void read(_T &f) {
    f = 0; _T fu = 1; char c = getchar();
    while(c < '0' || c > '9') {if(c == '-') fu = -1; c = getchar();}
    while(c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + (c & 15); c = getchar();}
    f *= fu;
}

const int N = 3670000;

map <ll, ll> val;
int mu[N], pri[N], isp[N], s[N], len = 0;
int T, n;

void Mu() {
    mu[1] = 1;
    for(int i = 2; i <= N - 10; i++) {
        if(!isp[i]) {pri[++len] = i; mu[i] = -1;}
        for(int j = 1; j <= len && i * pri[j] <= (N - 10); j++) {
            isp[i * pri[j]] = 1;
            if(i % pri[j] == 0) break;
            mu[i * pri[j]] = -mu[i];
        }
    }
    for(int i = 1; i <= N - 10; i++) s[i] = s[i - 1] + mu[i];
}

ll getmu(ll n) {
    if(n <= N - 10) return (ll)s[n];
    if(val.count(n)) return val[n];
    ll ans = 0;
    for(ll l = 2, r; l <= n; l = r + 1) {
        r = n / (n / l);
        ans += (r - l + 1) * getmu(n / l);
    }
    val[n] = 1 - ans;
    return val[n];
}

ll getphi(ll n) {
    ll ans = 0;
    for(ll l = 1, r; l <= n; l = r + 1) {
        r = n / (n / l);
        ans += (getmu(r) - getmu(l - 1)) * (n / l) * (n / l);
    }
    return (ans + 1) >> 1;
}

int main() {
    read(T); Mu();
    while(T--) {
        read(n);
        printf("%lld %lld\n", getphi(n), getmu(n));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/LJC00118/p/9532273.html

时间: 2024-10-09 07:21:14

luoguP4213 [模板]杜教筛的相关文章

[模板]杜教筛

用途 比线性更快($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

【模板】杜教筛(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_

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)\

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

【51nod-1239&amp;1244】欧拉函数之和&amp;莫比乌斯函数之和 杜教筛

题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 杜教筛裸题,不过现在我也只会筛这俩前缀和... $$s(n)=\sum _{i=1}^{n}f(i)$$ 那么就有: $$\sum_{i=1}^{n}f(i)\lfloor \frac{n}{i} \