TYVJ 1107 Hankson的趣味题 解题报告
因式分解神马的,具体上代码:
#include <math.h> #include <stdio.h> #include <stdlib.h> int a0, a1, b0, b1; int prim[20000], num[20000], end; int ans[200000], len; int gcd(int a, int b) { int t; while(b != 0){ t = a % b; a = b; b = t; } return a; } void dfs(int now, int pro) { int i; if(now == end){ ans[len++] = pro; return; } dfs(now + 1, pro); for(i = 1; i <= num[now]; i++){ pro *= prim[now]; dfs(now + 1, pro); } } void work(int n) { int i = 2; int lim = sqrt(n); while(n != 1 && i <= lim){ if(n % i == 0){ if(a0 % i == 0 && a1 % i != 0){ while(n % i == 0){ n /= i; } i++; continue; } prim[end] = i; num[end] = 0; while(n % i == 0){ num[end]++; n /= i; } end++; } i++; } if(n != 1){ prim[end] = n; num[end++] = 1; } dfs(0, 1); } int main(int argc, char **argv) { int i; int n, t; scanf("%d", &n); while(n--){ scanf("%d%d%d%d", &a0, &a1, &b0, &b1); t = len = end = 0; work(b1); for(i = 0; i < len; i++){ if(gcd(ans[i], a0) == a1 && b0 / gcd(b0, ans[i]) * ans[i] == b1){ t++; } } printf("%d\n", t); } return 0; }