【BZOJ3944】Sum(杜教筛)
【BZOJ3944】Sum(杜教筛)
题面
求$$\sum_{i=1}n\mu(i)和\sum_{i=1}n\phi(i)$$
范围:\(n<2^{31}\)
令$$S(n)=\sum_{i=1}^n\mu(i)$$
随便找个函数\(g\)和\(\mu\)做狄利克雷卷积
\]
对这个玩意求前缀和
\]
把\(d\)给提出来
\]
\]
把\(g(d)\)提出去
\]
把前面设的东西带回去
\]
那么,我们发现,我们要求的是\(S(n)\)
\]
\]
我们知道:
\]
令\(g(x)=1\)
前面一堆东西是什么呀?
\]
所以,
\]
后面的东西很显然可以数论分块
但是,我们不可能算完所有的东西
所以,线性筛预处理\(n^{\frac{2}{3}}\)项的前缀和
对于大于这个范围的值就做数论分块,然后递归处理
再看一下\(\phi\)怎么做
和前面一样,设出前缀和
\]
找个函数\(g\)来做卷积
\]
求个前缀和
\]
\(g\)提出来
\]
\]
\]
根刚才的式子没什么区别
\]
\]
我们又知道一个式子:
\]
也就是:$$(1*\phi)(i)=i$$
所以
\]
\]
和前面一样的,预处理\(n^\frac{2}{3}\)项
然后递归算就可以了
如果紧紧把范围卡在\(n^\frac{2}{3}\)这题会\(TLE\)???
一定是我常数太丑
反正可以多筛点
于是就多筛点
然后就\(AC\)啦???
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 2500000
#define ll long long
inline ll read()
{
ll x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
bool zs[MAX+10];
int pri[MAX+10],tot;
ll mu[MAX+10],phi[MAX+10];
map<ll,ll> mm,pp;
void pre()
{
zs[1]=true;mu[1]=phi[1]=1;
for(int i=2;i<=MAX;++i)
{
if(!zs[i])pri[++tot]=i,mu[i]=-1,phi[i]=i-1;
for(int j=1;j<=tot&&i*pri[j]<=MAX;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j])mu[i*pri[j]]=-mu[i],phi[i*pri[j]]=phi[i]*phi[pri[j]];
else{mu[i*pri[j]]=0;phi[i*pri[j]]=phi[i]*pri[j];break;}
}
}
for(int i=1;i<=MAX;++i)phi[i]+=phi[i-1];
for(int i=1;i<=MAX;++i)mu[i]+=mu[i-1];
}
ll Mu(ll x)
{
if(x<=MAX)return mu[x];
if(mm[x])return mm[x];
ll ret=0;
ll i=2,j;
while(i<=x)
{
j=x/(x/i);
ret+=(j-i+1)*Mu(x/i);
i=j+1;
}
return mm[x]=1-ret;
}
ll Phi(ll x)
{
if(x<=MAX)return phi[x];
if(pp[x])return pp[x];
ll ret=0;
ll i=2,j;
while(i<=x)
{
j=x/(x/i);
ret+=(j-i+1)*Phi(x/i);
i=j+1;
}
return pp[x]=x*(x+1)/2-ret;
}
int main()
{
pre();
int T=read();
while(T--)
{
ll n=read();
printf("%lld %lld\n",Phi(n),Mu(n));
}
return 0;
}
【BZOJ3944】Sum(杜教筛)的更多相关文章
- [BZOJ3944]Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6201 Solved: 1606[Submit][Status][Discuss ...
- [bzoj3944] sum [杜教筛模板]
题面: 传送门 就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和 思路: 就是杜教筛的模板 我们把套路公式拿出来: $ g\left( ...
- bzoj3944: Sum 杜教筛板子题
板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...
- 3944: Sum[杜教筛]
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3471 Solved: 946[Submit][Status][Discuss] ...
- 【Bzoj3944】杜教筛模板(狄利克雷卷积搞杜教筛)
题目链接 哇杜教筛超炫的 有没有见过$O(n^\frac{2}{3})$求欧拉函数前缀和的算法?没有吧?蛤蛤蛤 首先我们来看狄利克雷卷积是什么 首先我们把定义域是整数,陪域是复数的函数叫做数论函数. ...
- 洛谷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 ...
- 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 ...
- BZOJ3944: Sum(杜教筛模板)
BZOJ3944: Sum(杜教筛模板) 题面描述 传送门 题目分析 求\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\) 数据范围线性不可做. ...
随机推荐
- ConcurrenHashMap源码分析(二)
本篇博客的目录: 一:put方法源码 二:get方法源码 三:rehash的过程 四:总结 一:put方法的源码 首先,我们来看一下segment内部类中put方法的源码,这个方法它是segment片 ...
- CentOS常用命令大全
一:使用CentOS常用命令查看cpumore /proc/cpuinfo | grep "model name" grep "model name" /pro ...
- mysql-connector-java 6.x 时区设置
最近遇到了一个问题,java从mysql从读出的时间与本地时间有14个小时的时间差,经查证.测试解决了此问题,在此总结一下: jdbc:mysql:&allowMultiQueries=tru ...
- ADO.NET通用类库
using System.Data; using System.Data.SqlClient; namespace DataService { public class SQLHelper { pub ...
- CSS布局(四) float详解
一.float设计初衷 因为float被设计出来的初衷是用于--文字环绕效果.即,一个图片一段文字,图片float:left之后,文字会环绕图片. <div style="width: ...
- MySQL 日志的类型
日志文件对于一个服务器来说是非常重要的,它记录着服务器的运行信息,许多操作都会写日到日志文件,通过日志文件可以监视服务器的运行状态及查看服务器的性能,还能对服务器进行排错与故障处理,MySQl中有六种 ...
- 2道acm简单题(2013):1.(时分秒)时间相减;2.主持人和N-1个人玩游戏,每个人说出自己认识的人数,判断其中是否有人说谎。
/*1.题目:输入一个数,代表要检测的例子的个数,每个例子中:输入两个时间(格式HH:MM : SS),前面时间减去后面时间,输出在时钟上显示的时间,格式一样,如果是以为数字的前面补零.*//**思路 ...
- 1.4 random模块
Python中的random模块用于生成随机数,下面介绍一下random模块中最常用的几个函数. 国际惯例,用模块之前先导入: >>> import random (一)random ...
- Batch Normalization&Dropout浅析
一. Batch Normalization 对于深度神经网络,训练起来有时很难拟合,可以使用更先进的优化算法,例如:SGD+momentum.RMSProp.Adam等算法.另一种策略则是高改变网络 ...
- C# 如何使用预处理指令?
#define Debug #define Release #undef Release #if Debug using System; #endif 注意:#define 必须在文档最前面