题目链接

Problem Description
Multiple query, for each n, you need to get $$$$$$ \sum_{i=1}^{n} \sum_{j=1}^{i-1}{ [gcd(i + j, i - j) = 1]} $$$$$$
Input
On the first line, there is a positive integer T, which describe the number of queries. Next there are T lines, each line give a positive integer n, as mentioned above.
T<=1e5, n<=2e7
Output
Your output should include T lines, for each line, output the answer for the corre- sponding n.
Sample Input
4
978
438
233
666
Sample Output
194041
38951
11065
89963
题意
给定n,求代数式的值
分析
$$$gcd(i+j,i-j)$$$在形式上不够直观,不好分析,根据$$$gcd$$$的性质转化把它转化为$$$gcd(2j,i-j)$$$,通过交换求和顺序,并把$$$i-j$$$视为整体,原式转化为
$$$$$$
\begin{align}
\text{原式}&= \sum_{i=1}^{n} \sum_{j=1}^{i-1}{ [gcd(i + j, i - j) = 1]}\\
&= \sum_{i=1}^{n} \sum_{j=1}^{i-1}{[gcd(2j, i - j) = 1]}\\
&= \sum_{j=1}^{n-1} \sum_{i=j+1}^{n}{[gcd(2j, i-j) = 1]}\\
&= \sum_{j=1}^{n-1} \sum_{i=1}^{j-1}{[gcd(2j, i) = 1]}
\end{align}
$$$$$$

注意到$$$\sum_{j=1}^{n-1} \sum_{i=1}^{j-1}$$$其实是在二维平面上三角形的区域内求和,于是进一步改写为:
$$$$$$
\sum_{i,j}^{i+j\le n}{[gcd(2j, i) = 1]}
$$$$$$

$$$$$$
\begin{align}
\text{令: }& f(n)=\sum_{i,j}^{i+j\le n}{[gcd(2j, i) = 1]}\\
& g(n)=f(n)-f(n-1)=\sum_{i,j}^{i+j=n}{[gcd(2j, i) = 1]}
\end{align}
$$$$$$
注意到当$$$i+j=n$$$时,代入$$$j=n-i$$$,可以消掉$$$j$$$,并利用gcd的性质,可以进一步简化$$$g(n)$$$:
$$$$$$
\begin{align}
g(n)&=\sum_{i=1}^{n-1}{[gcd(2n-2i, i) = 1]}\\
&=\sum_{i=1}^{n-1}{[gcd(2n, i) = 1]}
\end{align}
$$$$$$
所以接下来的问题就是,求$$$[1, n-1]$$$内,与$$$2n$$$互质的数有多少个。
这个问题可以继续简化,假设在$$$[1,n-1]$$$范围内,有$$$a_1,a_2,a_3,...a_p$$$与$$$2n$$$互质,那么根据gcd的性质,在$$$[n, 2n-1]$$$的范围内,相应的有$$$2n-a_1,2n-a_2,2n-a_3,...,2n-a_p$$$与$$$2n$$$互质。也就是说,两个范围内与$$$2n$$$互质的数是一样多的,所以结果很简单$$$g(n)$$$就是$$$\varphi(2n)$$$的一半,$$$g(n)=\varphi(2n)/2$$$。
$$$g(n)$$$已经不能再化简了,接下来再来看$$$f(n)$$$就容易多了,根据$$$f(n)$$$的递推式$$$g(n)=f(n)-f(n-1)$$$,很容易发现
$$$$$$
\begin{align}
f(n) &=\sum_{i=1}^{n}g(n) \\
& =\sum_{i=1}^{n}{\varphi(2n)/2}\\
& =\frac{\sum_{i=1}^{n}{\varphi(2n)}}{2}
\end{align}
$$$$$$
所以只需要对欧拉函数进行打表,并求$$$\varphi(2n)$$$的前缀和,就能知道任何的$$$f(n)$$$。
但是做到这还可以继续优化,这道题的n是2e7,但是却需要对前4e7项欧拉函数打表。可以这样优化一下空间:打表发现,欧拉函数满足下面的性质:
$$$$$$\varphi(2n)=
\begin{cases}
\varphi(n), & \text{n是奇数}\\[2ex]
2\varphi(n), & \text{n是偶数}
\end{cases}
$$$$$$
所以可以将$$$f(n)$$$改为:
$$$$$$
\begin{align}
f(n) &=\sum_{i=1}^{n}{\frac{(2-i\&1)\varphi(n)}{2}}\\
&=\sum_{i=1}^{n}{\frac{\varphi(n)}{1+i\&1}}
\end{align}
$$$$$$
至此,只需要求出$$$\varphi(i)$$$的前2e7项,并求出上面的前缀和,就能在$$$O(nlogn)$$$求出答案。需要注意的是,前缀和需要用long long保存。另外有一点就是,打表4e7项欧拉函数可能会超时,原因在于板子的效率问题,改用效率更高的欧拉函数打表的板子就不存在超时的问题了(不要问我是怎么知道的)。

总结
为什么手速这么慢,一定是有什么地方想复杂了吧。
代码
#include<stdio.h>
typedef long long LL;
#define maxn 20000000
int p[maxn+];
LL arr[maxn+]; int prepare(){
int i,j;
//打表欧拉函数
for(i=; i<=maxn; i++)
p[i]=i;
for(i=; i<=maxn; i+=)
p[i]/=;
for(i=; i<=maxn; i+=)
if(p[i]==i){
for(j=i; j<=maxn; j+=i)
p[j]=p[j]/i*(i-);
}
/*把规模从2n缩减到n的原因
phi(2*n)= phi(n) n奇数
2*phi(n) n偶数
arr[n] =phi(2)/2+phi(4)/2+...phi(2*n)/?
=phi(1)/2+phi(2)+...phi(n)/?
*/
arr[]=p[]/;
for(int i=;i<=;++i){//求前缀和
arr[i]=arr[i-]+p[i]/((i&)+);
}
} int main(){
prepare();
int kase,n;
for(scanf("%d",&kase);kase;--kase){
scanf("%d",&n);
printf("%lld\n",arr[n]);
} }

hdu 6434 Count (欧拉函数)的更多相关文章

  1. Problem I. Count - HDU - 6434(欧拉函数)

    题意 给一个\(n\),计算 \[\sum_{i=1}^{n}\sum_{j=1}^{i-1}[gcd(i + j, i - j) = 1]\] 题解 令\(a = i - j\) 要求 \[\sum ...

  2. HDU 2824 简单欧拉函数

    1.HDU 2824   The Euler function 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2824 3.总结:欧拉函数 题意:求(a ...

  3. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. HDU 2588 GCD (欧拉函数)

    GCD Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status De ...

  5. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

  6. HDU 1695 GCD (欧拉函数,容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. hdu 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. HDU 3501【欧拉函数拓展】

    欧拉函数 欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 通式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)-..(1- ...

  9. GuGuFishtion HDU - 6390 (欧拉函数,容斥)

    GuGuFishtion \[ Time Limit: 1500 ms\quad Memory Limit: 65536 kB \] 题意 给出定义\(Gu(a, b) = \frac{\phi(ab ...

随机推荐

  1. 20155232 2016-2017-2《Java程序设计》课程总结

    20155232 2016-2017-2<Java程序设计>课程总结 作业汇总 (按顺序)每周作业链接汇总 预备作业1:你期望的师生关系是什么? 预备作业2:技能与经验之谈 预备作业3:初 ...

  2. 20155232 2016-2017-2 《Java程序设计》第2周学习总结

    20155232 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 类型 基本类型 整数(short.int.long) 字节(byte) -128~127 字 ...

  3. VirtualBox上LInux命令初步学习

    大二的寒假已经接近了尾声,寒假期间我初步使用了VirtualBox虚拟机软件,并安装了ubuntu的操作系统进行了Linux语言的学习.然而寒假期间的学习没有太多的计划,纯粹是为了完成作业而应付性的学 ...

  4. High Water Mark 图示

    +---- high water mark of newly created table | V +-------------------------------------------------- ...

  5. [BZOJ2961]共点圆-[凸包+cdq分治]

    Description 传送门 Solution 考虑对于每一个点: 设圆的坐标为(x,y),点的坐标为(x0,y0).依题意得,当一个点在圆里,需要满足(x-x0)2+(y-y0)2<=x2+ ...

  6. StringUtils工具类用法

    /*1.字符串以prefix开始*/ StringUtils.startsWith("sssdf","");//结果是:true StringUtils.sta ...

  7. Mac 安装PHP Redis 扩展

    其实 Mac 安装 Redis 还是很简单,以下为个人搭建配置.注意:文章中的“*”代表任意版本号 安装 Redis 服务 安装 brew install redis 使用 # 启动 redis-se ...

  8. Mac 必备工具之 brew

    brew 是 Mac 下的一个包管理工具,类似于 centos 下的 yum,可以很方便地进行安装/卸载/更新各种软件包,例如:nodejs, elasticsearch, kibana, mysql ...

  9. 用原生JS实现的一个导航下拉菜单,下拉菜单的宽度与浏览器视口的宽度一样(js+html+css)

    这个导航下拉菜单需要实现的功能是:下拉菜单的宽度与浏览器视口的宽度一样宽:一级导航只有两项,当鼠标移到一级导航上的导航项时,相应的二级导航出现.在本案例中通过改变二级导航的高度来实现二级导航的显示和消 ...

  10. uvaoj 156Ananagrams(map和vector组合使用)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...