【数论】 求小于等于 N 的与N互质的所有数的乘积mod N

           求小于等于N 的所有与N互质的数的乘积modN。这是今天训练赛的一道题。RP极高的我们愣是找出了结论。

           结论:对于 1,2,4,P^n, 2*P^n,答案为 N-1,其余情况都是1。也就是说,1,2,4,以及只有一个质因子(奇数)或者它的1/2只有一个

                       质因子(偶数),答案是N-1.其余情况答案均是 1。

           附程序:

#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #define min(a,b) ((a)<(b)?(a):(b)) #define INF 0x1f1f1f1f #define MAXN 40000 using namespace std; int p[MAXN],cont[50]; bool flag[MAXN]; int k,num; void get_prime(){ memset(flag,false,sizeof(flag)); k = 0; for(int i = 2;i < MAXN; ++i){ if(!flag[i]) p[k++] = i; for(int j = 0;j < k && i*p[j] < MAXN; ++j){ flag[i*p[j]] = true; if(i % p[j] == 0) break; } } } bool cal(int n){ num = 0; for(int i = 0;p[i] <= n && i < k; ++i){ if(n%p[i] == 0){ while(n%p[i] == 0) n /= p[i]; num++; if(num > 1) return false; } if(n == 1) break; } if(n > 1) num++; if(num > 1) return false; return true; } int main() { int n; get_prime(); while(scanf("%d",&n) != EOF){ if(n != 4 && n % 4 == 0){ printf("1/n"); continue; } if(n%2 == 0){ if(cal(n/2)){ printf("%d/n",n-1); continue; }else{ printf("1/n"); continue; } }else{ if(cal(n)){ printf("%d/n",n-1); continue; }else{ printf("1/n"); continue; } } } }

你可能感兴趣的:(【数论】 求小于等于 N 的与N互质的所有数的乘积mod N)