hdu 3501(欧拉函数引申)

题意:求小于N与N不互质的数的和
欧拉公式的引伸:小于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2。(n>1)

 1 #include<iostream>
 2 #include<string.h>
 3 #include<string>
 4 #include<sstream>
 5 #include<vector>
 6 #include<deque>
 7 #include<map>
 8 #include<algorithm>
 9 #include<iomanip>
10 #include<math.h>
11 #include<set>
12 using namespace std;
13 
14 typedef long long ll;
15 typedef unsigned long long ull;
16 const int mod = 1000000007;
17 ll Eular(ll n)
18 {
19     ll res = n;
20     if (n == 1)
21         return 1;
22     for (int i = 2; i*i <= n; i++)
23     {
24         if (n%i == 0)
25         {
26             res = res / i * (i - 1);
27             while (n%i == 0)
28                 n = n / i;
29         }
30     }
31     if (n != 1)
32     {
33         res = res / n * (n - 1);
34     }
35     return res;
36 }
37 int main()
38 {
39     ll n;
40     while (cin >> n&&n)
41     {
42         
43         ll ans = ((n - 1)*n / 2%mod - Eular(n)*n / 2 % mod +mod) %mod;
44         cout << ans << endl;
45     }
46     return 0;
47 }

 

posted on 2019-02-16 22:16  QingFengDaHui  阅读(145)  评论(0编辑  收藏  举报

导航