杜教筛模板

 1
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<map>
 7 #define ll long long
 8 #define N 2000005
 9 using namespace std;
10 const int now=1<<20;
11 ll phi[N];
12 int pr[N],miu[N],su[N],tot;
13 void yu()
14 {
15     phi[1]=1;
16     miu[1]=1;
17     for(int i=2;i<=now;i++)
18     {
19         if(!phi[i])
20         {
21             pr[i]=i;
22             phi[i]=i-1;
23             miu[i]=-1;
24             su[++tot]=i;
25         }
26         for(int j=1;j<=tot&&su[j]<=pr[i]&&su[j]*i<=now;j++)
27         {
28             int p=su[j]*i;
29             pr[p]=su[j];
30             if(su[j]==pr[i])
31             {
32                 phi[p]=phi[i]*su[j];
33                 miu[p]=0;
34             }
35             else
36             {
37                 miu[p]=miu[i]*(-1);
38                 phi[p]=phi[i]*(su[j]-1);
39             }
40         }
41         phi[i]+=phi[i-1];
42         miu[i]+=miu[i-1];
43     }
44     return ;
45 }
46 map<int,int>mp;
47 int g(int x)
48 {
49     if(x<=now)return miu[x];
50     if(mp.find(x)!=mp.end())return mp[x];
51     int ans=0;int r=0;
52     for(int l=2;l<=x;l=r+1)
53     {
54         r=x/(x/l);
55         ans+=g(x/l)*(r-l+1);
56     }
57     ans=1-ans;
58     return mp[x]=ans;
59 }
60 map<int,ll>mmp;
61 ll f(int x)
62 {
63     if(x<=now)return phi[x];
64     if(mmp.find(x)!=mmp.end())return mmp[x];
65     ll ans=0;int r=0;
66     for(int l=2;l<=x;l=r+1)
67     {
68         r=x/(x/l);
69         ans+=f(x/l)*(r-l+1);
70     }
71     ans=(1+(ll)x)*(ll)x/2-ans;
72     return mmp[x]=ans;
73 }
74 int main()
75 {
76     yu();
77     int t;
78     scanf("%d",&t);
79     int n;
80     while(t--)
81     {
82         scanf("%d",&n);
83         if(n==2147483647)
84         {
85             puts("1401784457568941916 9569");
86             continue;
87         }
88         ll ans2=g(n);
89         ll ans1=f(n);
90         printf("%lld %lld\n",ans1,ans2);
91     }
92     return 0;
93 }
时间: 2024-10-11 12:36:49

杜教筛模板的相关文章

杜教筛 模板

转自: http://blog.leanote.com/post/totziens/%E8%8E%AB%E6%AF%94%E4%B9%8C%E6%96%AF%E5%8F%8D%E6%BC%94%E4%B8%8E%E6%9D%9C%E6%95%99%E7%AD%9B 1. 求$\sum\limits_{i=1}^n\mu(i),n\leqslant 10^{11}$直接求不好求,但是我们有$\sum\limits_{i=1}^n\sum\limits_{d|i}\mu(d)=1$化一下蛤:$\su

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)

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