Description

小菜的妹妹小诗就要读小学了!正所谓计算机要从娃娃抓起,小菜决定在幼儿园最后一段轻松的时间里教妹妹编程。

 小菜刚教完gcd即最大公约数以后,一知半解的妹妹写了如下一段代码:sum:=0;for i:=1 to n-1 dofor j:=i+1 to n do sum:=sum+gcd(i,j)

显然这个程序的效率是很低的,小明打算写一个更强的程序,在求出sum的同时比妹妹跑的更快。

Input

 第一行一个整数t,即表示有t组数据接下来t行,每行一个整数n

Output

 t行,每行一个整数,表示n所对应的sum值

Sample Input

2

10

100

Sample Output

67

13015

Data Constraint

Hint

【数据规模】

 20%数据t≤100,n≤10040%数据t≤1000,n≤2000100%数据t≤10000,n≤1000000

The Solution

本周做了一道关于欧拉函数的题,
引起了我对欧拉函数的兴趣,
于是呢就找了这题来玩玩~~

题意很简单就是要求

∑i=1n∑j=i+1ngcd(i,j)

\sum^{n}_{i=1}\sum^{n}_{j=i+1}gcd(i,j)

写得臭请见谅 o((>ω< ))o

转入正题——

首先我们得知道一个性质

先抛开这道题目

假设我们要求I=1~n的 gcd(n,i) gcd(n,i)的和,你会怎么做呢?

很显然这暴力并不科学,n非常大

于是

我们可以先假设 gcd(n,i)=k gcd(n,i)=k,则 gcd(n/k,i/k)=1 gcd(n/k,i/k) = 1
即假设 gcd(n/k,x)=1 gcd(n/k,x) = 1 则 gcd(n,x∗k)=k gcd(n,x*k)=k
gcd(n,x∗k)=k gcd(n,x*k)=k k的取值是确定的,即n的所有因子,
所以满足 gcd(n/k,x)=1 gcd(n/k,x) = 1个x的个数乘以k即为所有满足 gcd(n,i)=k gcd(n,i)=k的和。

因此题目就转化为 ∑ϕ(n/k)∗k \sum\phi(n/k)*k

这个题目也是类似的,只不过把n变成求1~n间的 gcd(i,j) gcd(i,j)

好了知道这个性质,我们可以做这道题了

首先 我们可以设一个求和数组sum,他满足
sum(n)=sum(n−1)+gcd(1,n)+gcd(2,n)+...+gcd(n−1,n) sum(n) = sum(n-1) + gcd(1,n) + gcd(2,n)+...+gcd(n-1,n)
设 数组f[i]表示j=1~i的 gcd(j,i) gcd(j,i)值,则
f(n)=gcd(1,n)+gcd(2,n)+...+gcd(n−1,n)=∑i∗ϕ(n/i) f(n) = gcd(1,n)+gcd(2,n)+...+gcd(n-1,n)=\sum{i*\phi{(n/i)}} I是n的因子

然后就用线筛预处理出phi
再预处理出f和sum数组即可

CODE

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define N 1000005using namespace std;typedef long long ll;int n,tot = 0;
int Pri[N],Phi[N];
ll f[N],sum[N];
bool Mark[N];void PHI(int m)
{Phi[1] = 1;fo(i,2,m){if (! Mark[i]) Phi[i] = i - 1,Pri[++ Pri[0]] = i;fo(j,1,Pri[0]){int x = Pri[j];if (i * x > m) break;Mark[i*x] = true;if (i % x == 0) {Phi[i*x] = Phi[i] * x; break;}else Phi[i*x] = Phi[i] * Phi[x]; }}
}int main()
{freopen("data.in","r",stdin);freopen("data.out","w",stdout);int t;scanf("%d",&t);PHI(N-5);fo(i,1,N-5)for (int j = i + i; j <= N -5;j += i) f[j] += i * Phi[j / i];sum[1] = 0;fo(i,2,N-5) sum[i] = sum[i-1] + f[i];while (t --){scanf("%d",&n);printf("%lld\n",sum[n]);}return 0;
}

这里再贴个求

∑i=1ngcd(i,n)

\sum^{n}_{i=1}gcd(i,n)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;__int64 Euler(__int64 n)
{__int64 i,temp=n;for(i=2;i*i<=n;i++)if(n%i==0){while(n%i==0)n=n/i;temp=temp/i*(i-1);}if(n!=1)temp=temp/n*(n-1);return temp;
}int main()
{__int64 n,i,sum,k;while(scanf("%I64d",&n)>0){sum=0;for(i=1;i*i<=n;i++){if(n%i==0)sum=sum+Euler(n/i)*i;k=n/i;if(n%k==0 && k!=i)sum=sum+Euler(n/k)*k;}printf("%I64d\n",sum);}return 0;
}

51 nod 最大公约数之和 (求1~n里面各个数的gcd和 n=1000000)相关推荐

  1. 51 NOD 1238 最小公倍数之和 V3

    原题链接 最近被51NOD的数论题各种刷--(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解--那么既然A了就来骗一波访问量吧-- (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧-- ...

  2. 51 NOD 1363 最小公倍数之和 (欧拉函数思维应用)

    1363 最小公倍数之和 推式子 ∑i=1nlcm(i,n)=n∑i=1nigcd(i,n)=n∑d∣n∑i=1nid(gcd(i,n)==d)=n∑d∣n∑i=1ndi(gcd(i,nd)==1)= ...

  3. [51 nod 1238] 最小公倍数之和 V3(杜教筛)

    1238 最小公倍数之和 V3 推式子 ∑i=1n∑j=1nlcm(i,j)=∑i=1n∑j=1nijgcd(i,j)=∑d=1n∑i=1n∑j=1nijd(gcd(i,j)==d)=∑d=1nd∑i ...

  4. [51 nod 123] 最大公约数之和 V3(杜教筛)

    1237 最大公约数之和 V3 推式子 ∑i=1n∑j=1ngcd(i,j)=∑d=1nd∑i=1n∑j=1n(gcd(i,j)==d)=∑d=1nd∑i=1nd∑j=1nd(gcd(i,j)==1) ...

  5. 51 nod 1405 树的距离之和

    1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和. ...

  6. 51nod1040 最大公约数之和,欧拉函数或积性函数

    1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6时,1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 看起来很简单 ...

  7. 最大公约数之和——极限版II

    P1490 - [UVa11426 ]最大公约数之和--极限版II Description Input 输入包含至多100组数据.每组数据占一行,包含正整数N(2<=N<=1<N&l ...

  8. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],-,a[n].有一个集合,刚开 ...

  9. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫"文明"的游戏.大妈正在 ...

最新文章

  1. python好不好用_python应用情况怎么样?是否真的值得学习?
  2. EBB-11、Linux启动流程
  3. 新计算机教师工作随笔反思,信息技术反思随笔 (2)
  4. JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
  5. java基础----IO字节流
  6. @select 怎么写存储过程_MySQL4:存储过程和函数
  7. python(22)--面向对象1-封装
  8. 微型计算机生产制约因素,精品解析:广东省东莞市2019-2020学年高三下学期第一次统考(5月)模拟考试文科综合地理试题...
  9. Hadoop Hive概念学习系列之HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)(十八)...
  10. 独轮车(广搜_队列)
  11. PC 平台上的一种快速 Red Hat Linux 安装方法
  12. asp解决“另一个SqlParameterCollection中已包含SqlParameter”的方法
  13. c语言开发宏程序,一文搞懂宏程序的编程基础,快速入门秘笈
  14. 雅诗兰黛公司以2019年乳腺癌防治运动团结全世界并带来希望
  15. MOOC 哈工大苏小红C语言 第七周练兵区——编程题
  16. user相关的一些命令及用法
  17. html背景渲染原理(body透明渐变)
  18. 真人快打服务器维护多久,《真人快打11》故事模式约8小时 玩家表示比较理想...
  19. 【自建exe】使用Electronjs为自己写windows软件
  20. python含义是什么_python _=是什么意思

热门文章

  1. 大连四六级百家外语考试中心大学英语四级成绩的作用有哪些?
  2. DNS-域名服务器(原理分析)
  3. 向量A和向量B的余弦
  4. ESXI如何封装网卡驱动
  5. 脑残手贱:被NFS祸害的调度系统
  6. 分享腾讯官方二维码生成接口地址
  7. 爬虫技术python nutch_基于Nutch的python爬虫分析
  8. ubuntu安装blocklocks与简单的设置方法
  9. 英语的简洁著名商品经典广告主题句
  10. Python查看源码