51Nod 1239 欧拉函数之和
来源:互联网 发布:花形透 知乎 编辑:程序博客网 时间:2024/06/05 06:41
转载请注明出处,谢谢http://blog.csdn.net/bigtiao097?viewmode=contents
题意:
给定n,求
思路:
这是我学杜教筛做的第二个题,第一个就是和这个非常相似的求莫比乌斯函数之和
给大家推荐唐老师的一篇文章,个人感觉讲的非常好,我就是在这里学的
欧拉函数的一个性质是这样的
所以就有
这样就得到了
感觉上面式子中最难理解的地方就是
可以这样理解
第二个式子中的
对于
然后就可以递归求解了,顺便加记忆化,顺便加上分段优化来求了
关于复杂度的问题,具体可以看上面推荐的文章,这里稍微说一下
- 如果我们先提前筛选出了
n23 的φ(n) 的前缀和,总体复杂度大概是O(n23) - 如果没有提前处理一下,直接递归求解的话, 总体复杂度大概是
O(n34)
然后再说一下递归过程中记忆化的时候用的什么数据结构
可以看一下我的另一篇文章里面说的传送门
这个题用三种结构都能过,而且时间差不多
具体代码如下:
Result:Accepted
#include<bits/stdc++.h>const int maxn = 4641590;//maxn = n^(2/3)const int mod = 1e9+7;using namespace std;typedef long long ll;const int HASH_MOD=987654;int phi[maxn];bool vis[maxn];int p[maxn];ll n;unordered_map<ll,ll> mp;void euler_init(){ phi[1]=1; for(int i=2;i<maxn;i++) { if(!vis[i]) { phi[i]=i-1; p[++p[0]]=i; } for(int j=1;p[j]*i<maxn;j++) { vis[p[j]*i]=1; if(i%p[j]==0) { phi[p[j]*i]=phi[i]*p[j]%mod; break; } phi[p[j]*i]=phi[i]*(p[j]-1)%mod; } } for(int i=1;i<maxn;i++) phi[i]= (phi[i]+phi[i-1])%mod;}ll mod_mul(ll x,ll n){ ll res = 0; while(n>0) { if(n&1) res = (res+x)%mod; x = (x<<1)%mod; n>>=1; } return res;}ll calc(ll x){ unordered_map<ll,ll>::iterator it; if (x<maxn) return phi[x]; if((it=mp.find(x))!= mp.end()) return it->second; ll ans = 0; if(x&1) ans = mod_mul(x,(x+1)/2); else ans = mod_mul(x/2,x+1); for(ll l=2,r; l<=x; l=r+1) { r=x/(x/l); ans=(ans-calc(x/l)*((r-l+1)%mod)%mod+mod)%mod; } return mp[x] = ans;}int main(){ euler_init(); scanf("%lld",&n); printf("%lld",calc(n));}
阅读全文
0 0
- 【51Nod 1239】欧拉函数之和
- 51nod 1239欧拉函数之和
- 【51NOD 1239】欧拉函数之和
- 51nod 1239 欧拉函数之和
- [51NOD]1239 欧拉函数之和
- 51nod 1239 欧拉函数之和
- 51Nod-1239-欧拉函数之和
- 51Nod 1239 欧拉函数之和
- 51nod 1239 欧拉函数之和
- 51nod 1239 欧拉函数之和
- 51nod 1239 欧拉函数之和
- [杜教筛模板] 51Nod 1239 欧拉函数之和
- 51 NOD 1239 欧拉函数之和(杜教筛)
- [杜教筛] 51Nod 1239: 欧拉函数之和
- 51nod-1040-最大公约数之和(欧拉函数)
- 51NOD 1040 最大公约数之和(分析 + 欧拉函数)
- 51nod-1040-1040 最大公约数之和(欧拉函数)
- 51NOD 1040 1040 最大公约数之和 数论 欧拉函数
- 常用工具函数整理(好多数论什么的公式)
- dubbo--服务提供者类图
- HDU 1024 Max Sum Plus Plus——♂简单♂DP
- hibernate不报错的错误
- 由浅入深JavaScript14进阶-复杂运动
- 51Nod 1239 欧拉函数之和
- 好像是第三天。
- 日期类功能大全
- 关于STM32标准外设库中的 USE_STDPERIPH_DRIVER, STM32F10X_MD
- Scales(dfs背包+剪枝)
- ARM学习笔记四
- MySQL 使用set names 解决乱码问题的原理
- 码农不识贝叶斯,虽知数据也枉然
- Kali linux搭建wifi绵羊墙