Irrelevant Elements, ACM/ICPC NEERC 2004, UVa1635
这种题目最重要的是思路了清晰
1 #include <cstdio> 2 #include <cstring> 3 const int maxn = 100005;//sqrt(n)+1 is enough 4 5 int fac[100][2]; 6 int fac_c[100]; 7 int a[maxn]; 8 void factor(int m) { 9 int& num = fac[0][0]; 10 num = 0; 11 for (int i = 2; i*i <= m; i++) { 12 if(m%i == 0) { 13 fac[++num][0] = i; 14 fac[num][1] = 0; 15 do { 16 fac[num][1]++; 17 m/= i; 18 } while(m%i == 0); 19 } 20 } 21 if (m > 1) { 22 fac[++num][0] = m; 23 fac[num][1] = 1; 24 } 25 } 26 bool check(int n, int j) { 27 int num = fac[0][0]; 28 int a = n - j; 29 int b = j; 30 for (int i = 1; i <= num; i++) { 31 //为了提高效率,只用检验m的分解式中的素因数 32 int p = fac[i][0]; 33 int& q = fac_c[i]; 34 for (; a%p == 0; a/=p, q++); 35 for (; b%p == 0; b/=p, q--); 36 } 37 for (int i = 1; i <= num; i++) { 38 if (fac[i][1] > fac_c[i]) { 39 return false; 40 } 41 } 42 return true; 43 } 44 int main(void) { 45 int n, m; 46 for (; scanf("%d%d", &n, &m)==2;printf("\n")) { 47 int cnt = 0; 48 factor(m); 49 memset(fac_c, 0, sizeof(fac_c)); 50 for (int i = 1; i < n; i++) { 51 if (check(n, i)) { 52 a[cnt++] = i+1; 53 } 54 } 55 printf("%d\n", cnt); 56 for (int i = 0; i < cnt; i++) { 57 printf("%s%d",i==0?"":" ", a[i]); 58 } 59 } 60 return 0; 61 }