51 nod 最大公约数之和 (求1~n里面各个数的gcd和 n=1000000)
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
本周做了一道关于欧拉函数的题,
引起了我对欧拉函数的兴趣,
于是呢就找了这题来玩玩~~
题意很简单就是要求
\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;
}
这里再贴个求
\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)相关推荐
- 51 NOD 1238 最小公倍数之和 V3
原题链接 最近被51NOD的数论题各种刷--(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解--那么既然A了就来骗一波访问量吧-- (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧-- ...
- 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)= ...
- [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 ...
- [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) ...
- 51 nod 1405 树的距离之和
1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和. ...
- 51nod1040 最大公约数之和,欧拉函数或积性函数
1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6时,1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 看起来很简单 ...
- 最大公约数之和——极限版II
P1490 - [UVa11426 ]最大公约数之和--极限版II Description Input 输入包含至多100组数据.每组数据占一行,包含正整数N(2<=N<=1<N&l ...
- 51 nod 1439 互质对(Moblus容斥)
1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],-,a[n].有一个集合,刚开 ...
- 51 nod 1427 文明 (并查集 + 树的直径)
1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫"文明"的游戏.大妈正在 ...
最新文章
- python好不好用_python应用情况怎么样?是否真的值得学习?
- EBB-11、Linux启动流程
- 新计算机教师工作随笔反思,信息技术反思随笔 (2)
- JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
- java基础----IO字节流
- @select 怎么写存储过程_MySQL4:存储过程和函数
- python(22)--面向对象1-封装
- 微型计算机生产制约因素,精品解析:广东省东莞市2019-2020学年高三下学期第一次统考(5月)模拟考试文科综合地理试题...
- Hadoop Hive概念学习系列之HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)(十八)...
- 独轮车(广搜_队列)
- PC 平台上的一种快速 Red Hat Linux 安装方法
- asp解决“另一个SqlParameterCollection中已包含SqlParameter”的方法
- c语言开发宏程序,一文搞懂宏程序的编程基础,快速入门秘笈
- 雅诗兰黛公司以2019年乳腺癌防治运动团结全世界并带来希望
- MOOC 哈工大苏小红C语言 第七周练兵区——编程题
- user相关的一些命令及用法
- html背景渲染原理(body透明渐变)
- 真人快打服务器维护多久,《真人快打11》故事模式约8小时 玩家表示比较理想...
- 【自建exe】使用Electronjs为自己写windows软件
- python含义是什么_python _=是什么意思