hdu 6434 Count (欧拉函数)
T<=1e5, n<=2e7
978
438
233
666
38951
11065
89963
$$$$$$
\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 (欧拉函数)的更多相关文章
- 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 ...
- HDU 2824 简单欧拉函数
1.HDU 2824 The Euler function 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2824 3.总结:欧拉函数 题意:求(a ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 2588 GCD (欧拉函数)
GCD Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Status De ...
- 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 和 ...
- HDU 1695 GCD (欧拉函数,容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 1695 GCD (欧拉函数+容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 3501【欧拉函数拓展】
欧拉函数 欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 通式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)-..(1- ...
- GuGuFishtion HDU - 6390 (欧拉函数,容斥)
GuGuFishtion \[ Time Limit: 1500 ms\quad Memory Limit: 65536 kB \] 题意 给出定义\(Gu(a, b) = \frac{\phi(ab ...
随机推荐
- 20155305 2016-2017-2 《Java程序设计》实验四 Android程序开发基础
实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组件.布局管理器的使用: 掌握Android中事件处理机制 实验 ...
- Why HBase
3.1.1,为什么选用HBases a) 容量巨大 HBase 的单表可以有百亿行.百万列,数据矩阵横向和纵向两个维度所支持的数据量级 都非常具有弹性.传统的关系型数据库,如 Oracle ...
- 【BZOJ4008】[HNOI2015]亚瑟王
[BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...
- 根据xml生成相应的对象类
根据xml生成相应的class对象,听起来很难其实很简单,用xsd.exe就能办到 打开vs 命令行运行xsd.exe 你的xml文件地址 空格/outputdir:存放xsd的地址 ok,这是生成了 ...
- 【CentOS】安装Docker教程
前提条件 Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上. Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位 ...
- CF刷题-Codeforces Round #481-D. Almost Arithmetic Progression
题目链接:https://codeforces.com/contest/978/problem/D 题解: 题目的大意就是:这组序列能否组成等差数列?一旦构成等差数列,等差数列的公差必定确定,而且,对 ...
- json_encode替代函数
<?php function jsonEncode($var) { if (function_exists('json_encode')) { return json ...
- Google TensorFlow for GPU安装、配置大坑
Google TensorFlow for GPU安装.配置大坑 从本周一开始(12.05),共4天半的时间,终于折腾好Google TensorFlow for GPU版本,其间跳坑无数,摔得遍体鳞 ...
- HDU-1053:Advanced Fruits(LCS+路径保存)
链接:HDU-1053:Advanced Fruits 题意:将两个字符串合成一个串,不改变原串的相对顺序,可将相同字母合成一个,求合成后最短的字符串. 题解:LCS有三种状态转移方式,将每个点的状态 ...
- hdfs遍历文件方法
import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org. ...