hdu-2619 Love you Ten thousand years

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2619

题目大意:

求出小于n的数的个数,满足ki mod n,1inn

解题思路:

n为奇素数,这个条件立马想到了原根,奇素数必定存在原根,而且每个原根a对应着一个模n简化剩余系。

n为奇素数,那么其欧拉函数值为n-1,简化剩余系就是1 2 3 ...... n - 1,正好是模n的完全剩余系。

这道题就转化成求出n的原根。

由定理,若m存在原根,则原根数目为φ(φ(m)),因为m是素数,φ(m) = m - 1,之需要求出φ(m - 1)即可

所以调用两次求欧拉函数值即可。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int euler_phi(int n)//求单个
 5 {
 6     int m = (int)sqrt(n + 0.5);
 7     int ans = n;
 8     for(int i = 2; i <= m; i++)if(n % i == 0)
 9     {
10         ans = ans / i * (i - 1);
11         while(n % i == 0)n /= i;
12     }
13     if(n > 1)ans = ans / n * (n - 1);
14     return ans;
15 }
16 int main()
17 {
18     int n;
19     while(cin >> n)
20     {
21         cout<<euler_phi(euler_phi(n))<<endl;//这样也行:cout<<euler_phi(n - 1)<<endl;
22     }
23     return 0;
24 }

 

posted @ 2018-05-14 21:25  _努力努力再努力x  阅读(154)  评论(0编辑  收藏  举报