洛谷P4213 Sum(杜教筛)
时间:2022-05-07
本文章向大家介绍洛谷P4213 Sum(杜教筛),主要内容包括题目描述、输入输出格式、输入输出样例、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述
给定一个正整数N(Nle2^{31}-1)N(N≤231−1)
求ans_1=sum_{i=1}^nphi(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
2333
输出样例#1:
1 1
2 0
22 -2
58 -3
278 -3
1655470 2
裸的杜教筛
sum_{i=1}^{n}varphi(i) = frac{ntimes(n+1)}{2} - sum_{d=2}^{n}sum_{i=1}^{lfloorfrac{n}{d}rfloor}varphi(i)
sum_{i=1}^{n}mu(i) = 1 - sum_{d=2}^{n}sum_{i=1}^{lfloorfrac{n}{d}rfloor}mu(i)
然后直接暴力递归计算即可
#include<cstdio>
#include<map>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define LL long long
using namespace std;
using namespace __gnu_pbds;
const int MAXN=5000030;
int N,limit=5000000,tot=0,vis[MAXN],mu[MAXN],prime[MAXN];
LL phi[MAXN];
gp_hash_table<int,LL>Aphi,Amu;
void GetMuAndPhi()
{
vis[1]=1;phi[1]=1;mu[1]=1;
for(int i=1;i<=limit;i++)
{
if(!vis[i]) prime[++tot]=i,phi[i]=i-1,mu[i]=-1;
for(int j=1;j<=tot&&i*prime[j]<=limit;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0){mu[i*prime[j]]=0; phi[i*prime[j]]=phi[i]*prime[j]; break;}
else {mu[i*prime[j]]=-mu[i]; phi[i*prime[j]]=phi[i]*(prime[j]-1); }
}
}
for(int i=1;i<=limit;i++) mu[i]+=mu[i-1],phi[i]+=phi[i-1];
}
LL SolvePhi(LL n)
{
if(n<=limit) return phi[n];
if(Aphi[n]) return Aphi[n];
LL tmp=n*(n+1)/2;
for(int i=2,nxt;i<=n;i=nxt+1)
nxt=min(n,n/(n/i)),
tmp-=SolvePhi(n/i)*(LL)(nxt-i+1);
return Aphi[n]=tmp;
}
LL SolveMu(LL n)
{
if(n<=limit) return mu[n];
if(Amu[n]) return Amu[n];
LL tmp=1;
for(int i=2,nxt;i<=n;i=nxt+1)
nxt=min(n,n/(n/i)),
tmp-=SolveMu(n/i)*(LL)(nxt-i+1);
return Amu[n]=tmp;
}
int main()
{
GetMuAndPhi();
int QWQ;
scanf("%d",&QWQ);
while(QWQ--)
{
scanf("%lld",&N);
printf("%lld %lldn",SolvePhi(N),SolveMu(N));
}
return 0;
}
- Linux Kernel CMPXCHG函数分析
- 无锁编程(五) - RCU(Read-Copy-Update)
- 无锁编程(六) - seqlock(顺序锁)
- 无锁编程(七) - 实战
- zookeeper的python客户端安装
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[上篇]
- 震撼:1分钟带你看完IC0的爆炸视频
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[下篇] (提供Source Code下载)
- bt、磁力怎么下载?老司机飙车终极思路……
- Linux进程间通信(五) - 信号灯(史上最全)及其经典应用案例
- 写出完美的snprintf
- 计算CPU利用率
- 详解Hadoop HA 如何运作
- Linux时间时区详解与常用时间函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法