#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
using namespace std;
typedef __int64 LL ;
LL pri[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47};
LL ans[100005], flag;
LL gcd(LL a, LL b) { //最大公因式求解模板
while (b) {
LL c = a % b;
a = b;
b = c;
}
return a;
}
LL multi(LL a, LL b, LL n) { //(a*b) mod n 模板
LL tmp = 0;
while (b) {
if (b & 1) {
tmp += a;
if (tmp >= n) tmp -= n;
}
a <<= 1;
if (a >= n) a -= n;
b >>= 1;
}
return tmp;
}
LL multimod(LL a, LL m, LL n) { //a^m mod n 模板
LL tmp = 1;
a %= n;
while (m) {
if (m & 1) tmp = multi(tmp, a, n);
a = multi(a, a, n);
m >>= 1;
}
return tmp;
}
bool MiLLer_Rabin(LL n) { 素数判定模板
if (n < 2) return 0;
if (n == 2) return 1;
if (!(n & 1)) return 0;
LL k = 0, i, j, m, a;
m = n - 1;
while (!(m & 1)) m >>= 1, k++;
for (i = 0; i < 10; i++) {
if (pri[i] >= n) return 1;
a = multimod(pri[i], m, n);
if (a == 1) continue;
for (j = 0; j < k; j++) {
if (a == n - 1) break;
a = multi(a, a, n);
}
if (j == k) return 0;
}
return 1;
}
LL poLLard_rho(LL c, LL n) {
LL i, x, y, k, d;
i = 1;
x = y = rand() % n;
k = 2;
do {
i++;
d = gcd(n + y - x, n);
if (d > 1 && d < n) return d;
if (i == k) y = x, k <<= 1;
x = (multi(x, x, n) + n - c) % n;
} while (y != x);
return n;
}
void rho(LL n) { //大整数因式分解模板
if (MiLLer_Rabin(n)) {
ans[flag] = n;
flag++;
return;
}
LL t = n;
while (t >= n) t = poLLard_rho(rand() % (n - 1) + 1, n);
rho(t);
rho(n / t);
return;
}
int main() {
LL n;
while(scanf("%I64d",&n) != EOF){
if( n == -1 ) break;
if( n == 1 ) {
puts( "0" ) ;continue ;
}
if( n == 2 ) {
puts( "1" ) ;continue ;
}
if(n != 4 && n % 4 == 0){
printf("1\n");
continue;
}
if(n%2 == 0){
flag = 0 ;rho(n/2);
sort( ans , ans + flag ) ;
bool ok ;
if( ans[0] == ans[flag-1] )
ok = true ;
else
ok = false ;
if( ok ){
printf("%I64d\n",n-1);
continue;
}else{
printf("1\n");
continue;
}
}else{
flag = 0 ;rho(n);
sort( ans , ans + flag ) ;
bool ok ;
if( ans[0] == ans[flag-1] )
ok = true ;
else
ok = false ;
if(ok){
printf("%I64d\n",n-1);
continue;
}else{
printf("1\n");
continue;
}
}
}
return 0 ;
}
题意 : 求 1 ~ n 中所有和n互质的数的乘积mod n。
思路 : 是一道原题 ... 有个这样的结论
结论:对于 1,2,4,P^n, 2*P^n,答案为 N-1,其余情况都是1。也就是说,1,2,4,以及只有一个质因子(奇数)或者它的1/2只有一个质因子(偶数),答案是N-1.其余情况答案均是 1。
好了,大整数分解下就完了