题目链接

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项欧拉函数可能会超时,原因在于板子的效率问题,改用效率更高的欧拉函数打表的板子就不存在超时的问题了(不要问我是怎么知道的)。

总结
为什么手速这么慢,一定是有什么地方想复杂了吧。
代码
  1. #include<stdio.h>
  2. typedef long long LL;
  3. #define maxn 20000000
  4. int p[maxn+];
  5. LL arr[maxn+];
  6.  
  7. int prepare(){
  8. int i,j;
  9. //打表欧拉函数
  10. for(i=; i<=maxn; i++)
  11. p[i]=i;
  12. for(i=; i<=maxn; i+=)
  13. p[i]/=;
  14. for(i=; i<=maxn; i+=)
  15. if(p[i]==i){
  16. for(j=i; j<=maxn; j+=i)
  17. p[j]=p[j]/i*(i-);
  18. }
  19. /*把规模从2n缩减到n的原因
  20. phi(2*n)= phi(n) n奇数
  21. 2*phi(n) n偶数
  22. arr[n] =phi(2)/2+phi(4)/2+...phi(2*n)/?
  23. =phi(1)/2+phi(2)+...phi(n)/?
  24. */
  25. arr[]=p[]/;
  26. for(int i=;i<=;++i){//求前缀和
  27. arr[i]=arr[i-]+p[i]/((i&)+);
  28. }
  29. }
  30.  
  31. int main(){
  32. prepare();
  33. int kase,n;
  34. for(scanf("%d",&kase);kase;--kase){
  35. scanf("%d",&n);
  36. printf("%lld\n",arr[n]);
  37. }
  38.  
  39. }

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. 微信小程序解决地图上的层级关系

    在有带地图的手机页面上,view无法显示在地图上方,所以,在wxml中,使用: <cover-view></cover-view> 能使view显示在地图上 注: 在该标签内部 ...

  2. 【LG4309】【BZOJ3173】[TJOI2013]最长上升子序列

    [LG4309][BZOJ3173][TJOI2013]最长上升子序列 题面 洛谷 BZOJ 题解 插入操作显然用平衡树就行了 然后因为后面的插入对前面的操作无影响 就直接在插入完的序列上用树状数组求 ...

  3. 使用iChecker的注意事项

    1. 要先引用jquery 2. ichecker分好多主题,每个主题带好几种颜色,在配置的时候最好指定一下. 比如引入了square主题的blue颜色演示,配置项中checkboxClass就写ic ...

  4. idea css文件不识别的问题的解决方案

    可以看到 progressBar不识别 发现仅仅是这一个文件名不识别 所以换一个任意别的文件名即可识别

  5. SOAPUI参数中xml中CDATA包含问题

    <![CDATA[ <Request> <CardNo>000002629518</CardNo> <SecrityNo/> <BankTr ...

  6. 基于Spring的最简单的定时任务实现与配置(三)--番外篇 cron表达式的相关内容

    本来这篇文章是会跟本系列的前两篇文章一起发布的.但是,昨天在找资料总结的时候遇到了一点意外,就延后了一些. 本篇的内容主要参考了 这篇博文:http://www.cnblogs.com/junrong ...

  7. 自己做的一个固定大小对象内存池,效率大概为原始的new/delete的2倍

    提升不高,不过好处是可以多次申请小对象,一次释放.(只适应于无动态申请资源的class) vs2012测试情况如下: // CHchFixLenMemPool.h #pragma once #ifnd ...

  8. Python接口测试实战2 - 使用Python发送请求

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  9. Web性能测试篇:AB 压力测试

    1. 压力测试的概念\定义 1.这段话是给刚接触\学习性能测试知识的初学者,在实际工作中都会接触到性能测试.压力测试.负载测试等专业名词也容易混淆,下面带大家熟悉下这到底是怎么定义: 1.1.性能测试 ...

  10. Vue 项目在其他电脑 npm run dev 运行报错的解决方法

    一个 Vue 项目从一台电脑上传到 github 上之后,再另外一台电脑上 git clone .并使用 npm run dev 或 npm run start 发生以下报错的解决方法.   报错原因 ...