1188 最大公约数之和 V2

1188 最大公约数之和 V2

题目来源: UVA

基准时间限制:2 秒 空间限制:262144 KB

给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和。

相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数):

G=0;

for(i=1;i<N;i++)

for(j=i+1;j<=N;j++)

{

G+=gcd(i,j);

}

Input

第1行:1个数T,表示后面用作输入测试的数的数量。(1 <= T <= 50000)
第2 - T + 1行:每行一个数N。(2 <= N <= 5000000)

Output

共T行,输出最大公约数之和。

Input示例

3
10
100
200000

Output示例

67
13015
143295493160思路:欧拉函数;http://www.cnblogs.com/zzuli2sjy/p/5831575.html是这个题的加强版,这里用筛法求欧拉函数,然后再用类似筛法的方法求每个数的约数对答案的贡献,最后求下前缀和
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<queue>
 6 #include<math.h>
 7 #include<set>
 8 #include<vector>
 9 #include<string.h>
10 using namespace std;
11 typedef long long LL;
12 bool prime[5000005];
13 int oula[5000005];
14 int ans[5000005];
15 LL ask[5000005];
16 int main(void)
17 {
18     int i,j;
19     int T,N;
20     for(i = 2; i <= 3000; i++)
21     {
22         if(!prime[i])
23         {
24             for(j = i; (i*j)<=5000005; j++)
25             {
26                 prime[i*j]=true;
27             }
28         }
29     }
30     int cn = 0;
31     for(i = 2; i <= 5000000; i++)
32     {
33         if(!prime[i])
34         {
35             ans[cn++]=i;
36         }
37     }
38     for(i = 0; i <= 5000000 ; i++)
39         oula[i]=i;
40     oula[1]=0;
41     memset(ask,0,sizeof(ask));
42     for(i = 0; i < cn; i++)
43     {
44         for(j = 1; j*ans[i] <= 5000000 ; j++)
45         {
46             oula[j*ans[i]]/=ans[i];
47             oula[j*ans[i]]*=ans[i]-1;
48         }
49     }
50     for(i = 1; i <= 5000000; i++)
51     {
52         for(j = 2; (i*j) <= 5000000; j++)
53         {
54             ask[i*j]+=oula[j]*i;
55         }
56     }
57     for(i = 2;i <= 5000000; i++)
58     {
59         ask[i]+=ask[i-1];
60     }
61     scanf("%d",&T);
62     while(T--)
63     {
64         scanf("%d",&N);
65         printf("%lld\n",ask[N]);
66     }
67     return 0;
68 }
				
时间: 2024-10-12 16:43:02

1188 最大公约数之和 V2的相关文章

51 nod 1188 最大公约数之和 V2

1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数): G=0; for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 5000

51 NOD 1188 最大公约数之和 V2(基础数论)

传送门 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和.计算这段程序 G=0; for(i=1; i < N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 50000) 第2 - T + 1行:每行一个数N.(2 <= N <= 5000000) Output 共T行,输出最大公约数之和. Input示例 3 10 100 20000

51nod 1188 最大公约数之和 V2

第二个\( O(T\sqrt(n)) \)复杂度T了..T了..T了...天地良心,这能差多少?! 于是跑去现算(. \[ \sum_{i=1}^{n-1}\sum_{j=i+1}^{n}gcd(i,j) \] \[ \sum_{d=1}^{n}d\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}[gcd(i,j)==d] \] \[ \sum_{d=1}^{n}d(\sum_{j=1}^{n}\sum_{i=1}^{j}[gcd(i,j)==d]-\sum_{j=1}^{n}[g

51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3

1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N(N <= 10^9) 输出 公约数之和 输入样例 6 输出样例 15 题解 \[ \sum_{i=1}^n\gcd(i,n)=\sum_{d|n}d\varphi(n) \] 暴力搞就行了. 1188 最大公约数之和 V2 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计

1040 最大公约数之和

1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N <= 10^9) Output 公约数之和 Input示例 6 Output示例 15思路:欧拉函数:找n的约数,k为n的一个约数,设s,n的最大公约数为k,那么我们可以知道gcd(s/k,n/

51nod 1040 最大公约数之和 (数学)

给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N <= 10^9) OutPut 公约数之和 Input示例 6 Output示例 15 AC代码: /** *@xiaoran *1 2 3 4 5 6 *1 2 3 2 1 6 *2个1,2个2,1个3,1个6,注意后面的值都是n的因子. *现在我们只需要计算出各个因子的个数就行了, *那么1的个数是与n互质的

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

P1490 - [UVa11426 ]最大公约数之和--极限版II Description Input 输入包含至多100组数据.每组数据占一行,包含正整数N(2<=N<=1<N<4000000).输入以N=0结束. Output 对于每组数据,输出一行,即所对应的G值.答案保证在64位带符号整数范围内. Sample Input 10 100 200000 0 Sample Output 67 13015 143295493160 Hint 数据范围: 对于30%的数据,2<

51Nod 1040 最大公约数之和

                                 1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 Input 1个数N(N <= 10^9) //实际上应该是n<=10^18 Output 公约数之和 Input示例 6 Output示例 15 欧拉函数 对于 样例 1 2 3 2 1 ----6 有2个1 2个2 和 1个3 两个1的情况

51nod_1040:最大公约数之和

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 给出一个n,求1-n这n个数,同n的最大公约数的和. 比较基础的一道数论题. //注:本人觉得理解好这里有助于去理解burnside定理的优化 #include<bits/stdc++.h> using namespace std; typedef long long LL; LL Eular(LL n) { LL ret=n; for(LL i=2