Given the value of N, you will have to find the value of G. The definition of G is given below:G =i<N∑i=1j∑≤Nj=i+1GCD(i, j) Here GCD(i, j) means the greatest common divisor of integer i and integer j.
For those who have trouble understanding summation notation, the meaning of G is given in the following code:
G=0;
for(i=1;i<N;i++)
for(j=i+1;j<=N;j++)
{
G+=gcd(i,j);
}
/*Here gcd() is a function that finds
the greatest common divisor of the two
input numbers*/
Input
The input file contains at most 100 lines of inputs. Each line contains an integer N (1 < N < 4000001). The meaning of N is given in the problem statement. Input is terminated by a line containing a single zero.
Output
For each line of input produce one line of output. This line contains the value of G for the corresponding N. The value of G will fit in a 64-bit signed integer.
Sample Input
10
100
200000
0
Sample Output
67
13015
143295493160
题目类型:欧拉函数+预打表
算法分析:简单分析可知有求解G(n)的递推公式:G(n) = G(n - 1) + F(n) 边界G(0) = 0。其中F(n) = Sigma{gcd (i, n)}, 0 < i < n。而对于gcd (a, b) = 1, a < b来说,gcd (2 * a, 2 * b) = 2,gcd (3 * a, 3 * b) = 3,… gcd (k * a, k * b) = k,则每次从小到大求出b的欧拉函数值,之后直接F(k * b) += k * euler[b],最后维护一个前缀和即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#include <set> #include <bitset> #include <list> #include <map> #include <stack> #include <queue> #include <deque> #include <string> #include <vector> #include <ios> #include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <algorithm> #include <utility> #include <complex> #include <numeric> #include <functional> #include <cmath> #include <ctime> #include <climits> #include <cstdarg> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cassert> using namespace std; #define CFF freopen ("aaa.txt", "r", stdin) #define CPPFF ifstream cin ("aaa.txt") #define LL long long const int INF = 0x7FFFFFFF; const int MOD = 1e9 + 7; const double EPS = 1e-6; const double PI = 2 * acos (0.0); const int maxn = 4e6 + 66; LL euler[maxn], aa[maxn]; LL Get () { memset (aa, 0, sizeof (aa)); for (LL i = 0; i < maxn; i++) euler[i] = i; for (LL i = 2; i < maxn; i += 2) euler[i] >>= 1; for (LL i = 2; i < maxn; i++) { if (euler[i] == i) { for (LL j = i; j < maxn; j += i) euler[j] -= euler[j] / i; } for (LL j = 1; j * i < maxn; j++) aa[j*i] += j * euler[i]; } for (LL i = 1; i < maxn; i++) aa[i] += aa[i-1]; } int main() { Get (); // CFF; LL n; while (scanf ("%lld", &n) != EOF) { if (n == 0) break; printf ("%lld\n", aa[n]); } return 0; } |
- « 上一篇:uva10935
- uva11988:下一篇 »