/* 比赛的时候是发现一点小规律的,但是没有从小规律中得出正确的结论,结果一直悲剧收场 比赛看了解题报告,重新敲了下结果还是wrong 今天在百度无意间看见,但是很辛苦的才AC a(n)等于(n的phi(n)函数次幂)乘以((((n的约数d的阶乘)除以(d的d次幂))的mu(n/d)函数次幂)的乘积)。 其中,phi即欧拉函数,等于n*Product(n的质因子p)(1-1/p),即n*(1-1/p1)*(1-1/p2)*...*(1-1/pk). mu函数:n是k个不同质数的乘积,则mu(1)=1;mu(n)=(-1)的k次幂。 我当时一看就晕了,不知道他怎么从如此复杂的公式推出的规律。。。 其实这题结果不是1就是n-1,我是根据打出的结果废了一个小时找的规律。即除去1外,分三种情况: 1,当n是素数时输出n-1; 2, 当n是2乘以一个素数时输出n-1; 3, 当n是质数p的k次方或2*(p的k次方)时输出n-1; (其实1,2都是3的k=1的情况,故实际仅两种情况。。。) 4, 其他的输出1。 */ import java.util.*; import java.io.*; import java.math.*; public class Main3508 { //static final int mod = 5000; static final int N = 40005; static boolean hash[] = new boolean[N]; static int prime[] = new int[N / 8]; static int p; public static void main(String[] args){ Scanner cin = new Scanner(new BufferedInputStream(System.in)); Prime(); while(cin.hasNext()){ int n = cin.nextInt(); // 一开始以为自己的欧拉可以处理n为素数的情况, 结果没有写好,一直wrong if(n < 8 || fun(n) || (n % 2 == 0 && fun(n / 2))){ System.out.println((n - 1)); continue; } if(Slove(n)){ System.out.println((n - 1)); continue; } System.out.println("1"); } } static boolean fun(int n){ int tt = (int)Math.sqrt(1.0 * n) + 1; for(int i = 2; i < tt; i++) if(n % i == 0) return false; return true; } static void Prime(){ Arrays.fill(hash, (boolean)false); int tt = (int)Math.sqrt(1.0 * N); for(int i = 2; i < tt; i++) if(!hash[i]) for(int j = 2; j * i < N; j++) hash[j * i] = true; p = 0; for(int i = 2; i < N; i++) if(!hash[i]) prime[p++] = i; //System.out.println(p); } static boolean Slove(int n){ int temp = n; for(int i = 1; prime[i] <= n && i < p; i++){ // 一定要有i < p 的条件的,不然 temp % prime[p] 肯定是= 0的 发现 a % 0 == 0的 if(temp % prime[i] != 0) continue; while(temp % prime[i] == 0){ temp /= prime[i]; } break; } if(temp == 1 || temp == 2) return true; return false; } } import java.util.*; import java.io.*; import java.math.*; public class Maininshi{ //static final int mod = 5000; static final int N = 40005; static boolean hash[] = new boolean[N]; static int prime[] = new int[N / 8]; static int p; public static void main(String[] args){ Scanner cin = new Scanner(new BufferedInputStream(System.in)); Prime(); while(cin.hasNext()){ int n = cin.nextInt(); if(Slove(n) || n < 8){ System.out.println((n - 1)); continue; } System.out.println("1"); } } static void Prime(){ Arrays.fill(hash, (boolean)false); int tt = (int)Math.sqrt(1.0 * N); for(int i = 2; i < tt; i++) if(!hash[i]) for(int j = 2; j * i < N; j++) hash[j * i] = true; p = 0; for(int i = 2; i < N; i++) if(!hash[i]) prime[p++] = i; //System.out.println(p); } static boolean Slove(int n){ if(n % 2 == 0) n /= 2; int temp = n; // 素数要从3开始 for(int i = 1; prime[i] < n && i < p ; i++){ if(temp % prime[i] != 0) continue; while(temp % prime[i] == 0){ temp /= prime[i]; } if(temp == 1) return true; break; } if(temp == n && n % 2 != 0) // 加n % 2 != 0 处理在2 ^ n 的数 return true; return false; } }