HDU 2619 - Love you Ten thousand years (数论)

来源:互联网 发布:简述数据预处理的内容 编辑:程序博客网 时间:2024/05/15 16:48

题意

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

思路

请教了SkyWalkerT巨巨。

其实是一个结论题。

对正整数(a,m)=1,如果 a 是模 m 的原根,那么 a 是整数模n乘法群(即加法群 Z/mZ 的可逆元,也就是所有与 m 互素的正整数构成的等价类构成的乘法群)Zn×的一个生成元。由于Zn×有 φ(m)个元素,而它的生成元的个数就是它的可逆元个数,即 φ(φ(m))个,因此当模m有原根时,它有φ(φ(m))个原根。

代码

#include <stack>#include <cstdio>#include <list>#include <cassert>#include <set>#include <iostream>#include <string>#include <vector>#include <queue>#include <functional>#include <cstring>#include <algorithm>#include <cctype>#include <string>#include <map>#include <cmath>using namespace std;#define LL long long#define ULL unsigned long long#define SZ(x) (int)x.size()#define Lowbit(x) ((x) & (-x))#define MP(a, b) make_pair(a, b)#define MS(arr, num) memset(arr, num, sizeof(arr))#define PB push_back#define X first#define Y second#define ROP freopen("input.txt", "r", stdin);#define MID(a, b) (a + ((b - a) >> 1))#define LC rt << 1, l, mid#define RC rt << 1|1, mid + 1, r#define LRT rt << 1#define RRT rt << 1|1const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;const double eps = 1e-8;const int MAXN = 1e7 + 2;const int MOD = 1e9 + 7;const int dir[][2] = { {-1, 0}, {0, -1}, { 1, 0 }, { 0, 1 } };int cases = 0;typedef pair<int, int> pii;LL get_phi(int n){    int m = (int)sqrt(n+0.5);    int ans = n;    for (int i = 2; i <= m; i++) if (n % i == 0)    {        ans = ans / i * (i-1);        while (n % i == 0) n /= i;    }    if (n > 1) ans = ans / n * (n-1);    return ans;}int main(){    int n;    while (~scanf("%d", &n))    {        printf("%d\n", get_phi(get_phi(n)));    }    return 0;}
0 0
原创粉丝点击