bzoj 3944: Sum(杜教筛)
3944: Sum
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 4930 Solved: 1313
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1
2
8
13
30
2333
Sample Output
2 0
22 -2
58 -3
278 -3
1655470 2
/*
就相当于111112222222333333333每个数都有相同的一坨,然后只算出一坨的第一个数,乘个他的次数,直接跳到下一坨
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define maxn 5000005
#define N 5000000
using namespace std;
int p[maxn],mu[maxn],cnt;
long long phi[maxn];
bool vis[maxn];
void prepare(){
memset(vis,,sizeof(vis));
phi[]=;mu[]=;
for(int i=;i<=N;i++){
if(!vis[i])p[++cnt]=i,phi[i]=i-,mu[i]=-;
for(int j=;j<=cnt&&i*p[j]<=N;j++){
vis[i*p[j]]=;
if(i%p[j]==){
phi[i*p[j]]=phi[i]*p[j];
mu[p[j]*i]=;break;
}
phi[i*p[j]]=phi[i]*phi[p[j]];
mu[i*p[j]]=-mu[i];
}
}
for(int i=;i<=N;i++)phi[i]+=phi[i-],mu[i]+=mu[i-];
}
map<long long,long long>lst_phi;
map<long long,int>lst_mu;
long long sum_phi(long long n){
if(n<=N)return phi[n];
if(lst_phi[n]!=)return lst_phi[n];
long long res=n*(n+)/;
for(long long i=,nxt;i<=n;i=nxt+){
nxt=n/(n/i);
res-=sum_phi(n/i)*(nxt-i+);
}
return lst_phi[n]=res;
}
int sum_mu(long long n){
if(n<=N)return mu[n];
if(lst_mu[n]!=)return lst_mu[n];
int res=;
for(long long i=,nxt;i<=n;i=nxt+){
nxt=n/(n/i);
res-=sum_mu(n/i)*(nxt-i+);
}
return lst_mu[n]=res;
}
int main(){
freopen("Cola.txt","r",stdin);
prepare();
int Q;scanf("%d",&Q);
while(Q--){
int n;scanf("%d",&n);
cout<<sum_phi(n)<<' '<<sum_mu(n)<<endl;
}
}
bzoj 3944: Sum(杜教筛)的更多相关文章
- bzoj 3944 Sum —— 杜教筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3944 杜教筛入门题! 看博客:https://www.cnblogs.com/zjp-sha ...
- BZOJ 3944: Sum [杜教筛]
3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...
- 3944: Sum[杜教筛]
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3471 Solved: 946[Submit][Status][Discuss] ...
- [BZOJ3944]Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6201 Solved: 1606[Submit][Status][Discuss ...
- 洛谷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 ...
- [bzoj3944] sum [杜教筛模板]
题面: 传送门 就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和 思路: 就是杜教筛的模板 我们把套路公式拿出来: $ g\left( ...
- bzoj3944: Sum 杜教筛板子题
板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...
- ●杜教筛入门(BZOJ 3944 Sum)
入门杜教筛啦. http://blog.csdn.net/skywalkert/article/details/50500009(好文!) 可以在$O(N^{\frac{2}{3}})或O(N^{\f ...
- bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】
一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...
随机推荐
- IDT 数据预览查询
前面做了一件非常愚蠢的事情,由于不会预览数据.我都是直接发布到webi去查看的.可以想象一下了.真是太年轻了.为自己感到十分的汗颜. 在数据基础层做好连接之后,可以查看数据基础 .会显示相应的join ...
- linux-常用指令3
系统管理命令 stat 显示指定文件的详细信息,比ls更详细 who 显示在线登陆用户 whoami 显示当前操作用户 host ...
- codeforces 710C C. Magic Odd Square(构造)
题目链接: C. Magic Odd Square Find an n × n matrix with different numbers from 1 to n2, so the sum in ea ...
- windows 安装 pytorch
之前都在服务器上跑pytorch,近来发现新版本可在windows上跑了,甚是开心. 环境: windows7 python3 无CPU 步骤: 1. 确保确保python版本在3.5.3/3.6. ...
- linux命令学习笔记(48):watch命令
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测 一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下 ...
- 优秀开源项目之二:流媒体直播系统Open Broadcaster Software
Open Broadcaster Software(OBS)是一款用于音视频录制和直播的免费开源软件.可以轻松部署到多种平台,目前支持Windows.MAC和Linux. 特性: 1.高性能的实时视频 ...
- [转]各种开源协议介绍 BSD、Apache Licence、GPL V2 、GPL V3 、LGPL、MIT
现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses /alphabeti ...
- Maven(3)-利用intellij idea创建maven web项目
本文通过一个例子来介绍利用maven来构建一个web项目.开发工具:intellij idea. 一.新建maven项目 此处选择:Create from archetype.表示从已有的maven模 ...
- LCS(最长公共子序列问题)
LCS(Longest Common Subsequence),即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. 原理: 事实上,最长公 ...
- Python:format()方法
转于:https://blog.csdn.net/zhang89xiao/article/details/53818906 博主:张肖的博客 描述: format的格式 replacement_fie ...