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) 编辑 收藏 举报