洛谷P4213(杜教筛)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 3e6 + 3;
int t, n, cnt;
bool v[maxn];
short mu[maxn];
int isp[maxn], phi[maxn];
LL sum1[maxn];
int sum2[maxn];
unordered_map<int,LL> dp1;
unordered_map<int,int> dp2;
void init() {
mu[1] = phi[1] = 1;
for(int i = 2; i < maxn; ++i) {
if(!v[i]) {
v[i] = 1;
mu[i] = -1;
phi[i] = i - 1;
isp[cnt++] = i;
}
for(int j = 0; j < cnt && i * isp[j] < maxn; ++j) {
v[i*isp[j]] = 1;
mu[i*isp[j]] = -mu[i];
if(i % isp[j] == 0) {
mu[i*isp[j]] = 0;
phi[i*isp[j]] = phi[i] * isp[j];
break;
}
phi[i*isp[j]] = phi[i] * (isp[j] - 1);
}
}
for(int i = 1; i < maxn; ++i) sum1[i] = sum1[i-1] + phi[i], sum2[i] = sum2[i-1] + mu[i];
}
LL getnum1(int x) {
if(x < maxn) return sum1[x];
if(dp1[x]) return dp1[x];
LL ans = 1LL * x * (x + 1) / 2;
for(int l = 2, r; l <= x; l = r + 1) {
r = x / (x / l);
ans = ans - 1LL * (r - l + 1) * getnum1(x/l);
}
return dp1[x] = ans;
}
LL getnum2(int x) {
if(x < maxn) return sum2[x];
if(dp2[x]) return dp2[x];
LL ans = 1;
for(int l = 2, r; l <= x; l = r + 1) {
r = x / (x / l);
ans = ans - 1LL * (r - l + 1) * getnum2(x/l);
}
return dp2[x] = ans;
}
int main() {
init();
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
printf("%lld %lld\n", getnum1(n), getnum2(n));
}
return 0;
}
洛谷P4213(杜教筛)的更多相关文章
- luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...
- 洛谷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=1 ...
- [洛谷P4213]【模板】杜教筛(Sum)
题目大意:给你$n$,求:$$\sum\limits_{i=1}^n\varphi(i),\sum\limits_{i=1}^n\mu(i)$$最多$10$组数据,$n\leqslant2^{31}- ...
- 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛
题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\] ...
- 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】
题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...
- 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛
题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...
- 洛谷 P6860 - 象棋与马(找性质+杜教筛)
题面传送门 首先我们来探究一下什么样的 \((a,b)\) 满足 \(p(a,b)=1\).不难发现只要点 \((1,0)\) 能够到达,那么网格上所有点都能到达,因为由于 \((1,0)\) 能够到 ...
- p4213 【模板】杜教筛(Sum)
传送门 分析 我们知道 $\varphi * 1 = id$ $\mu * 1 = e$ 杜教筛即可 代码 #include<iostream> #include<cstdio> ...
- P4213 【模板】杜教筛(Sum)
\(\color{#0066ff}{题 目 描 述}\) 给定一个正整数\(N(N\le2^{31}-1)\) 求 \(\begin{aligned} ans_1=\sum_{i=1}^n\varph ...
- P4213【模板】杜教筛(Sum)
思路:杜教筛 提交:\(2\)次 错因:\(\varphi(i)\)的前缀和用\(int\)存的 题解: 对于一类筛积性函数前缀和的问题,杜教筛可以以低于线性的时间复杂度来解决问题. 先要构造\(h= ...
随机推荐
- Java多线程看这一篇就足够了(吐血超详细总结)
进程与线程 进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程.多进程操作系统能同时达运行多个进程(程序),由于 ...
- 【记录】【java】JDK8新特性Stream方式遍历集合
由于是以流方式,所以怎么操作也不改变原来的集合 1.普通遍历forEach List<String> list = new ArrayList(); list.add("a&qu ...
- linux 高级
linux命令: top 查看整机的性能: ----(看内存(mem)和cpu) 1:查看cpu的cpu的核数按1连续: 2:id=idle(空闲率),值越大越好, 3:load av ...
- Spring security oauth2 password flow
Spring security oauth2 包含以下两个endpoint来实现Authorization Server: AuthorizationEndpoint: 授权请求访问端点, 默认url ...
- dp --- 二维dp + 最大上升子序列
<传送门> 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 74477 Accepted: 27574 ...
- 长乐国庆集训Day5
T1 方阵 题目 [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑是有一定规律的.兵马俑阵总共有n ...
- collections模块之defaultdict()与namedtuple()方法简单介绍
一.defaultdict() 作用:根据数据创建字典时,需要为一些数据生成字典,而且对值得类型进行限定的时候,考虑defaultdict from collections import defaul ...
- svn-疑难解决
Linux下搭建SVN服务器 https://blog.51cto.com/19940919/2095011 [SVN]出现SVN--Authorization failed错误原因 https:// ...
- DS 红黑树详解
通过上篇博客知道,二叉搜索树的局限在于不能完成自平衡,从而导致不能一直保持高性能. AVL树则定义了平衡因子绝对值不能大于1,使二叉搜索树达到了严格的高度平衡. 还有一种能自我调整的二叉搜索树, 红黑 ...
- (七)pdf的构成之文件体(page对象)
页面(page) 通过页面树访问文档的页面,页面树定义PDF文档中的所有页面.树包含表示PDF文档页面的节点,可以是两种类型:中间节点和叶节点.中间节点也称为页面树节点,而叶节点称为页面对象.最简单的 ...