博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 4805: 欧拉函数求和 杜教筛
阅读量:4626 次
发布时间:2019-06-09

本文共 1378 字,大约阅读时间需要 4 分钟。

复习一下杜教筛(所有除法向下取整)
 
公式:
 
$S(n)=\frac{\sum_{i=1}^{n}(f*g)(i)-\sum_{i=2}^{n}g(i)S(\frac{n}{i})}{g(1)}$  
 
应用时一定要满足 $\sum_{i=1}^{n}(f*g)(i)$ 要能够快速求出,且 $f,g$ 都为积性函数.
 
其中 $(f*g)(i)=\sum_{d|i}{f(d)g(\frac{i}{d})}$
 
就是 $f,g$ 的迪利克雷卷积
 
常见的变换: (证明就不给了)
 
一些定义: $I(x)=1,id(x)=x,\epsilon(x)=[x==1]$
 
(1) $(\mu*I)(i)=\epsilon(i)$
 
(2) $(\varphi*I)(i)=id(i)$
 
(3) $(id*\mu)(i)=\varphi(i)$           
#include
#define maxn 10000004#define ll long long #define M 1000002 using namespace std;void setIO(string s){ string in=s+".in"; freopen(in.c_str(),"r",stdin); }int cnt; bool vis[maxn]; int prime[maxn], phi[maxn]; ll sumv[maxn]; ll Sum(ll n) { return (n * (n + 1)) / 2; }inline void Init(){ int i,j; phi[1]=1; for(i=2;i<=M;++i) { if(!vis[i]) prime[++cnt]=i, phi[i]=i-1; for(j=1;j<=cnt&&1ll*prime[j]*i<=M;++j) { vis[prime[j]*i]=1; if(i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*(prime[j]-1); } } for(i=1;i<=M;++i) sumv[i]=sumv[i-1]+1ll*phi[i]; }map
sumphi; ll get(int n){ if(n<=M) return 1ll*sumv[n]; if(sumphi[n]) return sumphi[n]; ll re=1ll*Sum(n); int i,j; for(i=2;i<=n;i=j+1) { j=n/(n/i); re -= 1ll*(j-i+1) * 1ll*get(n/i); } return re; }int main(){ // setIO("input"); Init(); int n; scanf("%d",&n); printf("%lld\n",get(n)); return 0; }

  

转载于:https://www.cnblogs.com/guangheli/p/11089250.html

你可能感兴趣的文章
c++11 std::move() 的使用
查看>>
HDU 4607 Park Visit (DP最长链)
查看>>
实例学架构设计之源起复杂度
查看>>
leetcode- Rotate Array 旋转数组
查看>>
vue vuex
查看>>
POJ 2234 Matches Game 博弈论水题 Nim模型
查看>>
BBC-unit6 session4
查看>>
JS获取节点的兄弟,父级,子级元素的方法(js获取子级获取到换行与空格元素-FF)...
查看>>
ini文件操作
查看>>
Win7 本地打印后台处理程序服务没有运 怎么办
查看>>
Office WPS如何在页眉页脚添加一条横线
查看>>
php 中array_multisort排序,类似于对数据库中的记录依次按多列进行排序
查看>>
加密算法和MD5等散列算法的区别
查看>>
【python】函数返回值
查看>>
[原创]java WEB学习笔记26:MVC案例完整实践(part 7)---修改的设计和实现
查看>>
[JavaScript-PHP]无刷新Ajax+POST使用阿里云短信平台发送短信
查看>>
个人对习惯培养的拙见
查看>>
Java基础50题test9—求完数
查看>>
【记忆法】心智绘图
查看>>
Jzoj4458 密钥破解——Pollard-rho
查看>>