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;
}
posted @ 2011-08-05 19:44  zqynux  阅读(475)  评论(0编辑  收藏  举报