hdu3501

要我们求小于n并且不与n互素的数字的和, 那么可以转化为1->(n-1)的和减去小于n且与n互素的数字的和

首先,有gcd(n,i)=1, 那么gcd(n,n-i)=1, 这是因为如果a%s=0, b%s=0, 那么(a-b)%s=0

所以gcd(n,i)=1, 那么gcd(n,n-i)=1, 如果gcd(n,n-i)!=1 ,那么 gcd(n,n-(n-i))!=1,所以 如果gcd(n,i)=1,那么gcd(n,n-i)=1成立

下面设小于n且与n素数的数字的和为sum

sum = a[0] + a[1] + a[2] + ... + a[phi[n]],      (a[i]表示与n互素的数字)

sum = (n-a[0]) + (n-a[1]) + (n-a[2])+...+(n-a[phi[n]])

两个式子相加, 2*sum = phi[n]*n->sum = phi[n]*n/2

1->(n-1)的和为n*(n-1)/2

所以最终答案为n*(n-1)/2 - phi[n]*n/2

数据太大,要用long long

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 typedef  long long  LL;
16 const int INF = 1<<30;
17 /*
18
19 */
20
21
22 int euler(int n)
23 {
24     int m = sqrt(n) + 0.5;
25     int ans = n;
26     for (int i = 2; i <= m; ++i)
27     if (n%i == 0)
28     {
29         ans = ans / i * (i - 1);
30         while (n%i == 0) n /= i;
31     }
32     if (n > 1) ans = ans / n *(n - 1);
33     return ans;
34 }
35 int main()
36 {
37
38
39     LL n;
40     while (scanf("%I64d", &n), n)
41     {
42         LL t = euler(n)*n/2;
43         LL ans = n*(n - 1) / 2 - t;
44         printf("%I64d\n", ans % 1000000007);
45     }
46     return 0;
47 }

时间: 2024-10-05 05:07:27

hdu3501的相关文章

hdu3501 Calculation 2 欧拉函数

//求小于n且和n不互质的所有数之和 //若gcd(n , i) == 1 那么 gcd(n , n-i) == 1 //可以用反证法 //设gcd(n , n-i) != 1; //那么可以有 n = k1*a //n - i = k2*a ; //i = (k1-k2)*a //gcd(n ,i) != 1 //那么 ans = n*(n-1)/2 - n*euler(n)/2 #include<cstdio> #include<cstring> #include<ios

HDU3501 Calculation 2(欧拉函数)

题目求小于n不与n互质的正整数的和. 一个结论是小于n与n互质的正整数和=φ(n)*n/2. 因为如果a与n互质,那么n-a也与n互质,即若gcd(a,n)=1则gcd(n-a,n)=1,反证法即可证明. 也就是说小于n与n互质的数是成对的,且它们的和是n,共有φ(n)/2对. 所以小于n与n互质的正整数和=φ(n)*n/2. 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int phi(int n)

HDU3501 Calculation 2(欧拉函数推广)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3501 题意:求小于n的与n不互质的数的和: 分析: 欧拉函数的推广: 小于n的与n互质的数为phi(n),小于n的与n互质的数的和为phi(n)*n/2; 代码如下: #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long LL; cons

Hdu3501容斥原理

题意:问小于n且不与n互质的数的和是多少. 容斥原理求出和n互质的和,然后用 n*(n-1)/2 减以下,注意溢出. #pragma comment(linker,"/STACK:102400000,102400000") #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream> #include<string> #include<queue> #includ

HDU3501 Calculation 2 【欧拉函数】

Calculation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2279    Accepted Submission(s): 969 Problem Description Given a positive integer N, your task is to calculate the sum of the positi

HDU3501欧拉函数极重要推论

推论:小于N且与N互质的所有数的和(包括1)为 N*vola(N)/2 Given a positive integer N, your task is to calculate the sum of the positive integers less than N which are not coprime to N. A is said to be coprime to B if A, B share no common positive divisors except 1. InputF

Calculation 2 HDU - 3501

https://vjudge.net/problem/HDU-3501 不会做啊...记一下做法 做法是计算小于n且与n互质的数的和:根据如果gcd(i,n)==1,那么gcd(n-i,n)==1,对这些数两两一组分组,使得每组的和为n 原文地址:https://www.cnblogs.com/hehe54321/p/9320485.html