您的位置:首页 > 其它

TYVJ 1107 Hankson的趣味题 解题报告

2011-08-05 19:44 393 查看
  因式分解神马的,具体上代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: