興味深い質問の数の数について---------- Hankson

博士ハンクスは、BT(バイオテック、バイオ)フィールド、Hanksonという名前の息子はよく知られている専門家です。今、ちょうど家学校Hanksonから我々は興味深い質問を考えています。今日、教室で、教師は2つの正の整数の合計がc1c1方法を説明します

そして、c2c2

最大公約数と最小公倍数。今Hanksonは、あなたがこの知識を習得したと思う、彼は「公約数を求めている」と「逆問題」の質問のような「公倍数を求めて」を考えるようになった、質問はこれです:正の整数A0を考えると、A1、B0、 b1a0、A1、B0、B1

提供正の整数不明Xを満たす:1、X及びa0a0

最大公約数はA1A1です

;
2、X及びb0b0

最小公倍数はb1b1です

「逆問題」のHanksonは、正の整数xの条件を満たすように決定されます。しかし、少し考えた後、彼はそのようなxが一意でないことが判明し、存在すらしないかもしれません。彼は、xの条件を満たすように番号を解決する方法について考え始めるためになったので。彼はプログラミングの問題を解決するのに役立ちます。入力フォーマット行為第一の正の整数nは、入力データのn組。次のn行入力データのセットの各々は、4つの正の整数A0、A1、B0、b1a0、A1、B0、B1

、それぞれ2つの整数の間のスペースで区切られています。a0a0を確保するための入力データ

A1A1う

割り切れる、b1b1

b0b0う

割り切れます。N本の出力線共通出力フォーマット。ライン当たり各入力データの出力は、整数です。各試験のために:がある場合、Xは、出力は0であり; Xは、存在する場合、出力Xを満たす数条件、およびデータ1≤n≤20001≤n≤2000の範囲


1≤a0、A1、B0、b1≤2*1091≤a0、A1、B0、b1≤2* 109

サンプル入力:2
41 288 96 1
95 1 37 [1776
出力サンプル:6
2

アイデアは:見にDの数についてのすべてを列挙するかどうかの条件
を見つける方法すべての数は約1・dは
最初の素因数分解dを見つけ、その後、あるランダムな組み合わせのインデックスを超えることなく、品質係数のスクリーニング、すべての素因数を取りますこれは、すべての数についてです

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 50010;
int primes[N], cnt;
bool st[N];
struct factor{
 int p, s;
}factor[9];
int fcnt;
int dividor[N], dcnt;
void init(int n){
 for (int i = 2; i <= n; i ++){
  if (!st[i])   primes[cnt ++] = i;
  for (int j = 0; primes[j] * i <= n; j ++){
   st[primes[j] * i] = true;
   if (i % primes[j] == 0)   break;
  }
 }
}
void dfs(int u, int p){
 if (u == fcnt){
  dividor[dcnt ++] = p;
  return ;
 }
  for (int i = 0; i <= factor[u].s; i ++){
  dfs(u + 1, p);
  p *= factor[u].p;
 }
}
int gcd(int a, int b){
 return b ? gcd(b, a % b) : a;
}
int main(){
 init(N - 1);
 int n;
 cin >> n;
 while(n --){
  int a, b, c, d;
  cin >> a >> b >> c >> d; 
  fcnt = 0;
  int t = d;
  for (int i = 0; primes[i] <= t / primes[i]; i ++){
   int p = primes[i];
   if (t % p == 0){
    int s = 0;
    while(t % p == 0)   t /= p, s ++;
    factor[fcnt ++] = {p, s};
   }
  }
  if (t > 1)   factor[fcnt ++] = {t, 1};
  dcnt = 0;
  dfs(0, 1);
  int res = 1;
  for (int i = 0; i < dcnt; i ++){
   int x = dividor[i];
   if (gcd(a, x) == b && (LL)c * x / gcd(c, x) == d)   res ++; 
  }
   cout << res << endl;
 }
  return 0;
}
公開された106元の記事 ウォン称賛67 ビュー5422

おすすめ

転載: blog.csdn.net/qq_45772483/article/details/104957499