UVA 11424 GCD - Extreme (I) (欧拉函数+筛法)
题目:给出n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+gcd(1,4)+gcd(2,4)+gcd(3,4)+...+gcd(1,n)+gcd(2,n)+...+gcd(n-1,n)
此题和UVA 11426 一样,不过n的范围只有20000,但是最多有20000组数据。 当初我直接照搬UVA11426,结果超时,因为没有预处理所有的结果(那题n最多4000005,但最多只有100组数据),该题数据太多了额。。。
思路:令sum(n)=gcd(1,n)+gcd(2,n)+...+gcd(n-1,n),则所求结果ans(n)=sum(2)+sum(3)+...+sum(n)
只需求出sum(n),就可以推出所有答案:ans(n)=ans(n-1)+sum(n)(我当时怎么就没想到呢,额。。。)。
接下来重点就是求sum(n):
注意到所有gcd(x,n)都是n的约数,可以按照这个约数进行分类,用g(n,i)表示满足g(x,n)=i且x<n的正整数个数,
则sum(n)=sum{i*g(n,i)|i是n的约数}。注意到gcd(x,n)=i的充要条件是gcd(x/i,n/i)=1
(额,我是看到书上的这个提示,才想到怎么做的。。。),因此满足条件的x/i有phi(n/i)个(欧拉函数),说明g(n,i)=phi(n/i)。
由于时间限制,同素数筛选法,我们需要对于每个i枚举它的倍数n并更新sum(n),这些都在预处理中完成。
#include <iostream>
#include <stdio.h>
#include <string.h>
/*
数论题 题目:给出n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+gcd(1,4)+gcd(2,4)+gcd(3,4)+...+gcd(1,n)+gcd(2,n)+...+gcd(n-1,n) 思路:令sum(n)=gcd(1,n)+gcd(2,n)+...+gcd(n-1,n),则所求结果ans(n)=f(2)+f(3)+...+f(n)
只需求出f(n),就可以推出所有答案:ans(n)=ans(n-1)+sum(n)(我当时怎么就没想到呢,额。。。)。
接下来重点就是求sum(n):
注意到所有gcd(x,n)都是n的约数,可以按照这个约数进行分类,用g(n,i)表示满足g(x,n)=i且x<n的正整数个数,
则sum(n)=sum{i*g(n,i)|i是n的约数}。注意到gcd(x,n)=i的充要条件是gcd(x/i,n/i)=1
(额,我是看到书上的这个提示,才想到怎么做的。。。),因此满足条件的x/i有phi(n/i)个(欧拉函数),说明g(n,i)=phi(n/i)。
由于时间限制,同素数筛选法,我们需要对于每个i枚举它的倍数n并更新sum(n),这些都在预处理中完成。
*/
using namespace std;
const int maxn=;
int phi[maxn];
long long sum[maxn];
long long ans[maxn];
void init(){
memset(phi,,sizeof(phi));
memset(sum,,sizeof(sum));
memset(ans,,sizeof(ans));
phi[]=;
for(int i=;i<maxn;i++){
if(!phi[i]){
for(int j=i;j<maxn;j+=i){
if(!phi[j])
phi[j]=j;
phi[j]=phi[j]/i*(i-);
}
}
}
long long i,j;
for(i=;i<maxn;i++){
for(j=;i*j<maxn;j++){
/*
//原来第二次循环j是从1~maxn,循环中加个if条件,预处理都运行很慢很慢,超时
if(i*j>=maxn)
continue;
*/
sum[i*j]+=phi[i]*j; //n=i*j,j为n和x的公约数,类似于素数筛选法
}
}
/*
//白书上的代码 for(int i=1;i<maxn;i++){
for(int n=i*2;n<maxn;n+=i)
sum[n]+=i*phi[n/i];
}
*/
ans[]=sum[];
for(int i=;i<maxn;i++){
ans[i]=ans[i-]+sum[i]; //怎么都忘记可以利用前一项的结果啊!!!
}
}
int main()
{
init();
int n;
long long result;
while(scanf("%d",&n),n){
printf("%lld\n",ans[n]); //UVA上,注意是lld }
return ;
}
UVA 11424 GCD - Extreme (I) (欧拉函数+筛法)的更多相关文章
- UVA 11426 GCD - Extreme (II) (欧拉函数+筛法)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70017#problem/O 题意是给你n,求所有gcd(i , j)的和,其中 ...
- UVA 11426 GCD - Extreme (II) 欧拉函数
分析:枚举每个数的贡献,欧拉函数筛法 #include <cstdio> #include <iostream> #include <ctime> #include ...
- UVA 11426 GCD - Extreme (II)(欧拉函数打表 + 规律)
Given the value of N, you will have to find the value of G. The definition of G is given below:Here ...
- uva 11426 GCD - Extreme (II) (欧拉函数打表)
题意:给一个N,和公式 求G(N). 分析:设F(N)= gcd(1,N)+gcd(2,N)+...gcd(N-1,N).则 G(N ) = G(N-1) + F(N). 设满足gcd(x,N) 值为 ...
- UVA 11426 - GCD - Extreme (II) 欧拉函数-数学
Given the value of N, you will have to find the value of G. The definition of G is given below:G =i< ...
- UVA11426 GCD - Extreme (II) (欧拉函数/莫比乌斯反演)
UVA11426 GCD - Extreme (II) 题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 10 100 200000 0 输出样例#1: 67 13 ...
- UVA11426 GCD - Extreme (II)---欧拉函数的运用
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- GCD - Extreme(欧拉函数变形)
题目链接:https://vjudge.net/problem/UVA-11426 题目大意: 给出整数n∈[2,4000000],求解∑gcd(i,j),其中(i,j)满足1≤i<j≤n. 的 ...
- UVA11426 GCD - Extreme (II) —— 欧拉函数
题目链接:https://vjudge.net/problem/UVA-11426 题意: 求 ∑ gcd(i,j),其中 1<=i<j<=n . 题解:1. 欧拉函数的定义:满足 ...
随机推荐
- Linux实现的IEEE 802.q VLAN
本文转载自: http://blog.chinaunix.net/uid-20786208-id-4291059.html Technorati 标签: Linux VLAN ---------- ...
- vector C++ 详细用法
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...
- 《samba搭建win客户端和linux客户端的区别》
samba服务的搭建 客户的使用系统的不同也导致测试结果的不同. linux系统客户端: security = user or share smbclient -L //192.168.7.113/w ...
- 配置drbd高可用集群
前期准备: 同步时间 (两个节点) 节点一(172.16.21.6) [root@stu21 heartbeat2]# ntpdate 172.16.0.1 31 Dec 20:59:25 ntpda ...
- Delphi XE5教程11:Tokens
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...
- 含有自增序列的表中使用truncate与delete的不同结果
一个含有自增序列的表,使用delete跟truncate之后会有什么不同结果呢? 大概说一下,使用truncate,表中的记录全部被清除,如果向表中插入数据,那么数据的排序是从1开始的. 如果使用的是 ...
- android连接本地tomcat服务器,报timeout
1.在eclipse环境下连接时,没有任何问题 2.直接将服务端发布到tomcat服务下,报timeout 3.查明原因: 3.1打开IE访问,一切正常,可以获取到数据,说明不是服务端的问题 3.2打 ...
- 斐波那契(Fibonacci)数列的七种实现方法
废话不多说,直接上代码 #include "stdio.h" #include "queue" #include "math.h" usin ...
- python之字串
python字串声明: 单引('), 双引("), 三引(''' 或 """"). python字串前缀: r表示原生字串, 字串内容: (1)不能包 ...
- 关闭ios虚拟键盘的几种方法
在iOS应用开发中,有三类视图对象会打开虚拟键盘,进行输入操作,但如何关闭虚拟键盘,却没有提供自动化的方法.这个需要我们自己去实现.这三类视图对象分别是UITextField,UITextView和U ...