其实这题我也没太明白。。。

我们要求

\[\sum_{i=1}^{N-1}\sum_{j=i+1}^Ngcd(i,j)
\]

引理:

我们要求\(gcd(i,j)=k\)的个数,可转化为求\(gcd(i/k,j/k)=1\)的个数,即\(\varphi(N/k)\)。

那么如果要求所有满足\(gcd(i,j)=k\)的和,即求\(\varphi(N/k)*k\)。

为了满足10000组询问的复杂度,我们需要对这个式子做一些手脚。

设\(f(n)=gcd(1,n)+gcd(2,n)+\cdots+gcd(n-1,n)\)

则最终答案\(ans(n)=f(2)+f(3)+\cdots+f(n)\)。

难点在如何求\(f(n)\),前面提到,对于一个\(gcd(i,n)=k\),它对\(f(n)\)的贡献是\(\varphi(n/k)*k\)。

于是如果我们枚举\(k\),把所有\(f(n)\)算出来,复杂度就到了\(O(n^2)\),显然不可行。

然而实际上,对于一个\(gcd(i,n)=k\),有\(k\mid n\),显然所有\(gcd(i,n)\)一定不会超过\(n\),那么

\[f(n)=\sum_{k\mid n}k*\varphi(n/k)
\]

该式含义可转化为,对于一个\(k\),他会对所有\(f(ak),a>1\)产生\(k*\varphi(ak/k)\)的贡献。于是我们枚举\(k=1\sim n\),每次统计一遍\(k\)的贡献即可。

求完\(f(n)\)后,计算\(ans(n)\),实际上就相当于算了一个前缀和,询问的时候直接输出就得了。

参考代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 4000010
#define MOD 2520
#define E 1e-12
#define ll long long
using namespace std;
inline int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
ll n,phi[N],p[N],cnt,v[N],sum[N],s[N];
inline void init(int n)
{
phi[1]=1;
for(int i=2;i<=n;++i){
if(!v[i]){phi[i]=i-1;p[++cnt]=i;}
for(int j=1;j<=cnt;++j){
if(p[j]>n/i) break;
v[i*p[j]]=1;
if(i%p[j]==0){
phi[i*p[j]]=phi[i]*p[j];break;
}
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
for(int i=1;i<n;++i)
for(int j=i+i;j<n;j+=i){
sum[j]+=i*phi[j/i];
}
for(int i=1;i<=n;++i) sum[i]+=sum[i-1];
}
int main()
{
init(N);
while(~scanf("%d",&n)&&n!=0){
cout<<sum[n]<<endl;
}
return 0;
}

UVA11424 GCD - Extreme (I)[数论]的更多相关文章

  1. UVA 11426 - GCD - Extreme (II) (数论)

    UVA 11426 - GCD - Extreme (II) 题目链接 题意:给定N.求∑i<=ni=1∑j<nj=1gcd(i,j)的值. 思路:lrj白书上的例题,设f(n) = gc ...

  2. UVa11424 GCD - Extreme (I)

    直接两重循环O(n^2)算gcd……未免太耗时 枚举因数a和a的倍数n,考虑gcd(i,n)==a的i数量(i<=n) 由于gcd(i,n)==a等价于gcd(i/a,n/a)==1,所以满足g ...

  3. 洛谷 - UVA11424 - GCD - Extreme (I) - 莫比乌斯反演 - 整除分块

    https://www.luogu.org/problemnew/show/UVA11424 原本以为是一道四倍经验题来的. 因为输入的n很多导致像之前那样 \(O(n)\) 计算变得非常荒谬. 那么 ...

  4. UVA 11426 GCD - Extreme (II) (数论|欧拉函数)

    题意:求sum(gcd(i,j),1<=i<j<=n). 思路:首先能够看出能够递推求出ans[n],由于ans[n-1]+f(n),当中f(n)表示小于n的数与n的gcd之和 问题 ...

  5. 【UVa11426】GCD - Extreme (II)(莫比乌斯反演)

    [UVa11426]GCD - Extreme (II)(莫比乌斯反演) 题面 Vjudge 题解 这.. 直接套路的莫比乌斯反演 我连式子都不想写了 默认推到这里把.. 然后把\(ans\)写一下 ...

  6. spoj 3871. GCD Extreme 欧拉+积性函数

    3871. GCD Extreme Problem code: GCDEX Given the value of N, you will have to find the value of G. Th ...

  7. UVA 11426 GCD - Extreme (II) (欧拉函数)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Problem JGCD Extreme (II)Input: Standard ...

  8. UVA11426 GCD - Extreme (II) (欧拉函数/莫比乌斯反演)

    UVA11426 GCD - Extreme (II) 题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 10 100 200000 0 输出样例#1: 67 13 ...

  9. GCD - Extreme (II) for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } 推导分析+欧拉函数

    /** 题目:GCD - Extreme (II) 链接:https://vjudge.net/contest/154246#problem/O 题意: for(i=1;i<N;i++) for ...

随机推荐

  1. Website Scraping with Python 阅读笔记

    第一章 工程涉及的基本工具:requests, beautiful soup, scrapy. 法规与技术约定:read the Terms & Conditions and the Priv ...

  2. python:实现几种排序算法

    冒泡排序 比较相邻两个字符,如果左边大于右边,则交换位置,遍历一遍字符后,则最大的肯定在最右边:继续循环处理剩下的字符(最右边的不用再比较了,已经最大了) 代码实现: def BubbleSort(s ...

  3. kafka备份原理

  4. 袁新生《LINGO和Excel在数学建模中的应用》

    内容介绍 本书深入浅出地介绍了LINGO的基础知识.用LINGO语言描述现实问题的方法和用Excel处理数据的方法,重点是这两种软件在解决各种优化问题以及在数学建模中的应用,通过丰富的实例介绍了把实际 ...

  5. Java多线程编程(1)--Java中的线程

    一.程序.进程和线程   程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...

  6. PV、UV、UIP、VV、DAU、CTR指的是什么?

    PV(page view) 网站浏览量,指网页的浏览次数,用户每打开一次页面就记录一次PV,多次打开则累加. UV(unique vistor) 独立访客数,指的是某一天访问某站点的人数,以cooki ...

  7. php GD 和图像处理函数, 用 STHUPO.TTF 字体向图像写入文本

    php GD 和图像处理函数,   用  STHUPO.TTF 字体向图像写入文本 注意: 01)   imagettftext() 这个函数不能使用相对路径, 要想使用相对路径要先使用  puten ...

  8. pyspider 数据存入Mysql--Python3

    一.不写入Mysql 以爬取哪儿网为例. 以下为脚本: from pyspider.libs.base_handler import * class Handler(BaseHandler): cra ...

  9. Java之路---Day04

    2019-10-18-21:35:36 面向对象 学面向对象前要先知道什么叫面向过程,了解了什么叫面向过程才容易理解面向对象 面向过程(强调步骤) 概念:当需要实现一个功能的时候,每一个具体的步骤都要 ...

  10. 2019-07-25 PDO

    PDO是什么? pdo是php数据对象,即php data object .使用pdo是为了让我们能够使用相同的代码连接不同的数据库.PDO扩展是以面向对象的方式来进行封装,也就是说,我们的PDO扩展 ...