51 nod 最大公约数之和 (求1~n里面各个数的gcd和 n<=1000000)
来源:互联网 发布:qq飞车夜魔官方数据 编辑:程序博客网 时间:2024/05/16 11:36
Description
小菜的妹妹小诗就要读小学了!正所谓计算机要从娃娃抓起,小菜决定在幼儿园最后一段轻松的时间里教妹妹编程。
小菜刚教完gcd即最大公约数以后,一知半解的妹妹写了如下一段代码: sum:=0; for i:=1 to n-1 do for 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≤100 40%数据t≤1000,n≤2000 100%数据t≤10000,n≤1000000
The Solution
本周做了一道关于欧拉函数的题,
引起了我对欧拉函数的兴趣,
于是呢就找了这题来玩玩~~
题意很简单就是要求
写得臭请见谅 o((>ω< ))o
转入正题——
首先我们得知道一个性质
先抛开这道题目
假设我们要求I=1~n的
很显然这暴力并不科学,n非常大
于是
我们可以先假设
即假设
所以满足
因此题目就转化为
这个题目也是类似的,只不过把n变成求1~n间的
好了知道这个性质,我们可以做这道题了
首先 我们可以设一个求和数组sum,他满足
设 数组f[i]表示j=1~i的
然后就用线筛预处理出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;}
这里再贴个求
#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-n中所有数的最大公约数之和
- FZU 1969 GCD Extreme,UESTC 1723 吴神的大脑: _数论好题(求1-n中所有数的最大公约数之和)
- 求两个或N个数的最大公约数(gcd)和…
- 【ZOJ】4846 GCD Reduce(求n个数的最大公约数)
- 求gcd(1,n)+...+gcd(n,n)的和f(n)
- 求两个数或者N个数的最大公约数和最小公倍数
- 求两个数m,n的最大公约数和最小公倍数
- 求n组数的最大公约数
- 求N组数的最大公约数
- 求N组数的最大公约数
- 求N组数的最大公约数
- oj2447: 求N组数的最大公约数
- 【c语言】求两个数m和n的最大公约数(辗转相除法)
- 习题 2.4(7) 求两个数m和n的最大公约数。
- HDU 2582-f(n)(求n个组合数最大公约数的和)
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 1.把字符串转化为时间戳,再将时间戳转化为Date对象 /** *@parame time = 2016-12-12 19:41:59 * 或者2016
- Spark GC调优笔记
- mysql 数据库的备份与恢复
- Mobile phones poj 1195
- Windows下,Git的安装,使用,以及远程github
- 51 nod 最大公约数之和 (求1~n里面各个数的gcd和 n<=1000000)
- Makefile 中 -I -L的区别
- 3000的粉丝如何才能创造出30万的价值?
- 【NOIP2017模拟12.3】和【12.10】总结
- web前端之悟透JavaScript四:JavaScript真经(甘露)
- Material Design Support 学习笔记
- JavaScript中值被转化为布尔值问题,if(js)
- 16周一学期总结
- [Notes] 集训队论文 阅读小结