[51NOD1239]欧拉函数之和
来源:互联网 发布:数据结构排序算法心得 编辑:程序博客网 时间:2024/05/15 23:53
题目大意
给定
题目分析
杜教筛裸题。
令
然后按照
时间复杂度
代码实现
这个用记忆化实现的杜教筛比之前那个好看多了。
#include <iostream>#include <cstdio>#include <cmath>using namespace std;typedef long long LL;const int P=1000000007;const int L=4641600;const int N=100050;const int itwo=500000004;int pri[L],phi[L],sum[L],f[L];bool mark[L];bool vis[N];int S[N];int l,s;LL n;void pre(){ l=trunc(pow(n,2.0/3.0)),s=trunc(sqrt(n)); mark[1]=1,phi[1]=1,sum[1]=f[1]=1; for (int i=2;i<=l;++i) { if (!mark[i]) pri[++pri[0]]=i,phi[i]=i-1,f[i]=i; for (int j=1,k;j<=pri[0];++j) { if (1ll*pri[j]*i>l) break; mark[k=pri[j]*i]=1,f[k]=pri[j]; phi[k]=phi[i]*(pri[j]-(f[k]!=f[i])); if (!(i%pri[j])) break; } sum[i]=(sum[i-1]+phi[i])%P; }}int id(LL x){return n/x;}int sieve(LL n){ if (n<=l) return sum[n]; int idn=id(n),res=1ll*(n%P)*((n+1)%P)%P*itwo%P; if (vis[idn]) return S[idn]; for (LL st=2,en,x;st<=n;st=en) { x=n/st,en=n/x+1; res=(res-1ll*sieve(x)*(en-st)%P+P)%P; } return vis[idn]=1,S[idn]=res;}int main(){ freopen("phi.in","r",stdin),freopen("phi.out","w",stdout); scanf("%lld",&n),pre(),printf("%d\n",sieve(n)); fclose(stdin),fclose(stdout); return 0;}
0 0
- [51nod1239]欧拉函数之和
- [51NOD1239]欧拉函数之和
- 【51nod1239】 欧拉函数之和
- 【51Nod1239】欧拉函数之和-杜教筛+哈希表
- 【杜教筛】51Nod1239[欧拉函数之和]题解
- 51nod1239欧拉函数求和
- 51nod1040 最大公约数之和 (欧拉函数 )
- 【51Nod 1239】欧拉函数之和
- 【51nod1040】【最大公约数之和】【欧拉函数】
- 51nod 1239欧拉函数之和
- 【51NOD 1239】欧拉函数之和
- 51Nod1040 最大公约数之和 欧拉函数
- 51nod 1239 欧拉函数之和
- [51NOD]1239 欧拉函数之和
- 51nod 1239 欧拉函数之和
- 51Nod-1239-欧拉函数之和
- 51Nod 1239 欧拉函数之和
- 51nod 1239 欧拉函数之和
- Python结合Pywinauto 进行 Windows UI 自动化
- 小数化为分数
- CDH5.7.2部署流程
- x264代码详解——主函数main()
- 【C++】学习笔记三十——函数参数和按值传递
- [51NOD1239]欧拉函数之和
- 1、CSDN markdown 字体、字号、颜色设置(自己用的)
- 图片选择器(单选、多选、自定义张数)
- UI一般规则
- PAT 乙级 1043. 输出PATest(20) Java版
- 菜单栏用定位的方式来确定子菜单的位置,根据长度来计算居左还是居右
- ubuntu 16.04配置jdk环境
- 牛顿迭代法
- RecyclerView.OnScrollListener 滑动 逻辑需要在修改