zoukankan      html  css  js  c++  java
  • UVA 11426 GCD

    题目大意:

      求G的值,其中1<N<4000001;

    解题思路:

      假设[1,n-1]中所有的数分别与n的gcd的和记为b[n],可以看出G[n] = G[n-1] + b[n],

    这样就把题目转换为了求b[n]。

    假设a[x]表示使gcs(n, b) = x成立的b有多少个,b[n] = a[x1]*x1 + a[x2]*x2 + ...... + a[xk]*xk。

    我们只需要求a[n].

    因为有gcd的性质:gcd(n, b) = x --> gcd(n/x, b/x) = 1;可以用欧拉函数求出a[n/xi]即可。

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 
     8 #define maxn 4000005
     9 #define LL long long
    10 LL a[maxn], b[maxn], dp[maxn];
    11 
    12 int main()
    13 {
    14     int n, i, j;
    15     for (i=2; i<maxn; i++)
    16         if (!a[i])
    17             for (j=i; j<maxn; j+=i)
    18             {
    19                 if (!a[j])
    20                     a[j] = j;
    21                 a[j] = a[j] / i * (i-1);
    22             }
    23     //欧拉函数打表
    24     for (i=1; i<maxn; i++)
    25         for (j=i*2; j<maxn; j+=i)
    26             b[j] += a[j/i]*i;
    27     //[1,n-1]中所有的数与n的gcd的和
    28     for (i=2; i<maxn; i++)
    29         dp[i] = dp[i-1]+b[i];
    30     //题目所问
    31     while (scanf ("%d", &n), n)
    32         printf ("%lld
    ", dp[n]);
    33     return 0;
    34 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    spring-cloud Feign
    spring-cloud eureka注册发现
    spring-cloud zuul网关
    正则表达式整理
    nginx配置-Rewrite
    nginx配置-main
    nginx用途
    Java命令行命令
    Task
    JavaScript难点整理
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4459302.html
Copyright © 2011-2022 走看看