可以很简单的发现,当n是奇数的时候,f(n)=φ(n),否则f(n)=0。

所以我们就是求n<=5*10^8且n为奇数的φ的和。

首先我们可以做到用杜教筛算出φ的前缀和,但是如何把偶数的减去?

我们设h(x)为1<=n<=x且n为偶数的φ的和,可以得到: h(x)=Σ(1<=i<=x/2) φ(i) + h(x/2)。

为什么这样是对的呢?

考虑一个偶数n,它在2这个质因子上的指数可能是1或者大于1两种情况。

如果指数是是1的话那么φ(n)=φ(n/2) 否则φ(n)=φ(n/2)*2。

我们显然可以先把所有偶数在2上的指数都当成1,先加上 φ的前缀和,然后再把少加的加上。

显然只有一个偶数/2之后还是偶数才需要再加上一遍他的φ,因为只有这样它在2的次数才>1。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1000000;
using namespace std;
int zs[maxn/5],t=0;
map<int,ll> mmp;
bool v[maxn+5];
ll phi[maxn+5]; inline void init(){
phi[1]=1;
for(int i=2;i<=maxn;i++){
if(!v[i]) zs[++t]=i,phi[i]=i-1;
for(int j=1,u;j<=t&&(u=zs[j]*i)<=maxn;j++){
v[u]=1;
if(!(i%zs[j])){
phi[u]=phi[i]*zs[j];
break;
}
phi[u]=phi[i]*(zs[j]-1);
}
} for(int i=1;i<=maxn;i++) phi[i]+=phi[i-1];
} inline ll getphi(int x){
if(x<=maxn) return phi[x];
if(mmp.count(x)) return mmp[x]; ll an=x*(ll)(x+1)>>1ll;
for(int i=2,j,now;i<=x;i=j+1){
now=x/i,j=x/now;
an-=(j-i+1)*getphi(now);
} mmp[x]=an;
return an;
} inline void solve(int x){
ll ans=getphi(x);
x>>=1;
while(x) ans-=getphi(x),x>>=1;
printf("%lld\n",ans);
} int main(){
init();
solve(500000000);
return 0;
}

  

PE 512 Sums of totients of powers的更多相关文章

  1. 【PE512】Sums of totients of powers(欧拉函数)

    点此看题面 大致题意: 求\(\sum_{n=1}^{5*10^8}((\sum_{i=1}^n\phi(n^i))(mod\ n+1))\). 大力推式子 单独考虑\((\sum_{i=1}^n\p ...

  2. Linux----LVM扩容磁盘空间

    Linux系统LVM扩容一个分区相对于Windows来说没有那么直观,但是熟悉命令后,扩容起来也是蛮方便的. 扩容场景如下: [root@rhel06 ~]# df -Th Filesystem Ty ...

  3. 分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)

    分配粒度和内存页面大小 x86处理器平台的分配粒度是64K,32位CPU的内存页面大小是4K,64位是8K,保留内存地址空间总是要和分配粒度对齐.一个分配粒度里包含16个内存页面. 这是个概念,具体不 ...

  4. [PE结构分析] 5.IMAGE_OPTIONAL_HEADER

    结构体源代码如下: typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // +18h WORD Magic; // 标志字, ...

  5. PE文件结构部分解析以及输入的定位

    原文链接地址:http://www.cnblogs.com/shadow-lei/p/3554670.html PE文件定义 PE 文件("Portable executable" ...

  6. 手写PE文件(二)

    [文章标题]: 纯手工编写的PE可执行程序 [文章作者]: Kinney [作者邮箱]: mohen_ng@sina.cn [下载地址]: 自己搜索下载 [使用工具]: C32 [操作平台]: win ...

  7. 手写PE文件(一)

    DOS Header(IMAGE_DOS_HEADER)->64 Byte DOS头部 DOS Stub 112字节 "PE"00(Signature) 4个字节 IMAGE ...

  8. 利用PE数据目录的导入表获取函数名及其地址

    PE文件是以64字节的DOS文件头开始的(IMAGE_DOS_HEADER),接着是一段小DOS程序,然后是248字节的 NT文件头(IMAGE_NT_HEADERS),NT的文件头位置由IMAGE_ ...

  9. 破解软件系列-PE文件深入浅出之Section Table节表

    我们已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到 section table(节表)了.节表其实就是紧挨着 PE header 的一结构数组.该数组成员的数目 ...

随机推荐

  1. graph-Kruskal-algorithm

    并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.主要操作:1. 初始化:每个点所在集合初始化为其自身.2. 查找:查找元素所在的集合,即根节点.3. ...

  2. leetcode-7-hashTable

    解题思路: 这道题需要注意的是s和t长度相等,但都为空的情况.只需要扫描一遍s建立字典(char, count),然后扫描t,如果有 未出现的字母,或者键值小于0,就可以返回false了. bool ...

  3. SDUSToj第十一次作业源代码格式问题

    Problem I: 源代码的格式 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1471  Solved: 634 [Submit][Status][W ...

  4. hdu 6312

    Problem Description Alice and Bob are playing a game.The game is played on a set of positive integer ...

  5. Makefile基础(二)

    上一章:C语言之Makefile基础(一) 上一章的Makefile写的中规中矩,比较繁琐,是为了讲清楚基本概念,其实Makefile有很多灵活的写法,可以写的更简洁,同时减少出错的可能 一个目标依赖 ...

  6. luogu2455 [SDOI2006]线性方程组 高斯消元法

    #include <iostream> #include <cstdio> #include <cmath> using namespace std; int n, ...

  7. python - 接口自动化测试实战 - case1 - 再次优化版

    本次优化: 1.  各级分Package 2.  封装[ReadExcel]类 3.  封装[ReadConfig]类 4.  封装[GetLog]类 5.  引入ddt数据驱动测试,优化测试用例代码 ...

  8. js 判断ie的版本号

    //IE6判断: var isIE6 = !!window.ActiveXObject && !window.XMLHttpRequest; //或者: if(navigator.us ...

  9. Educational Codeforces Round 20 D. Magazine Ad

    The main city magazine offers its readers an opportunity to publish their ads. The format of the ad ...

  10. 九度oj 题目1391:顺时针打印矩阵

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2 ...