ブルーブリッジカップにおけるハンクソンの楽しい質問の数論

問題の説明
  ハンクス博士はBT(Bio-Tech)の分野で有名な専門家で、彼の息子の名前はハンクソンです。さて、学校から帰ってきたばかりのハンクソンさんが面白い質問を考えています。今日のクラスでは、教師は2つの正の整数c1とc2の最大公約数と最小公倍数を見つける方法を説明しました。ハンクソンはこの知識を熟練していると考えたので、「公約数を見つける」や「公倍数を見つける」などの問題の「逆問題」について考え始めます。 b1。未知の正の整数xが次の条件を満たすようにします:1。xとa0の最大公約数はa1、2です。xとb0の最小公倍数はb1です。ハンクソンの「逆問題」は、条件を満たす正の整数xを見つけることです。しかし、少し考えた後、彼はそのようなxは一意ではなく、存在さえしないかもしれないことを発見しました。そこで彼は、条件を満たすxの数を見つける方法を検討することにしました。プログラミングによってこの問題を解決するのを手伝ってください。
入力フォーマット
  最初の行を正の整数nとして入力します。これは、nセットの入力データがあることを示します。
  次のn行の入力データの各グループは、4つの正の整数a0、a1、b0、b1であり、2つの整数はそれぞれスペースで区切られています。入力データにより、a0はa1で割り切れ、b1はb0で割り切れることが保証されます。
出力フォーマット
  n行の出力があります。入力データの各セットの出力結果は1行を占め、整数になります。
  各データセットに対して、そのようなxがない場合は0を出力し、そのようなxがある場合は、条件を満たすxの数を出力してください。
入力例
2
41 1 96 288
95 1 37 1776
出力例
6
2
サンプルの説明
  入力データの最初のセットxは、9、18、36、72、144、288の合計6にすることができます。
  入力データの2番目のセット、xは48、1776の場合があり、合計2つあります。
データサイズと合意
  データの50%では、1≤a0、a1、b0、b1≤10000、n≤100であることが保証されています。
  100%データの場合、1≤a0、a1、b0、b1≤2,000,000,000、n≤2000であることが保証されています。
数学はひどいです、そして数論の主題はまだ学び始めていません。
最初に2人の兄のコードを貼り付け、後で確認します。
https://blog.csdn.net/IoT_fast/article/details/84843294から転載
1 #include <iostream>
 2 #include <fstream>
 3 #include <cstring> 
 4 #include <stdio.h>
 5 #include <cmath>
 6  
7  名前空間std を使用 ;
8 9 int gcd(int a、int b)// 求最大公因数10 {
 11 return b == 0?a:gcd(b、a%b);
12 }
 13 14 int main()
 15 {
 16 // freopen( "input / Hackson.txt"、 "r"、stdin); 17 
 
        
       
     int n、a0、a1、b0、b1、p、q、cnt = 0 ;
18      scanf(" %d "、&n);
19      while(n-- 20      {
 21          scanf(" %d%d%d%d "、&​​a0、&a1、&b0、&b1);
22          p = a0 / a1; q = b1 / b0;
23          forint i = 1 ; i <= sqrt(b1); i ++ 24          {
 25              if(b1%i == 0 26              {
 27                  if(gcd(i / a1、p)==1 
28                  && gcd(q、b1 / i)== 1 
29                  &&(i%a1 == 0))cnt ++ ;
30                  int j = b1 / i;
31                  もし(私は== j)を続けます32                  if(gcd(j / a1、p)== 1 && gcd(q、b1 / j)== 1 &&(j%a1 == 0))cnt ++ ;
33              }
 34          }
 35          printf(" %d \ n " 、cnt);
36          cnt = 0 ;
37      } 
 38      リターン 0 ;
39 }
https://www.liuchuo.net/archives/7751から転載
1 #include <bits / stdc ++。h>
 2  名前空間std を使用 3 int gcd(int a、int b){
 4 if(b == 0return a;
5 gcd(b、a%b);を
 返す 6 }
 7 名前空間std を使用します8 int main(){
 9 int a0、a1、b0、b1、k;
10      cin >> k;
11 while(k-- ){
 12 int ans = 0                                  ;
13          scanf(" %d%d%d%d "、&​​a0、&a1、&b0、&b1);
14          forint i = 1 ; i * i <= b1; i ++ ){
 15              if(b1%i == 0 ){
 16                  int n = i;
17                  if(gcd(a0、n)== a1 && b0 * n == b1 * gcd(b0、n))
 18                      ans ++ ;
19                  if(i!= b1 / i){
 20                      n = b1 / i;
21                      if(gcd(a0、n)== a1 && b0 * n == b1 *gcd(b0、n))
 22                          ans ++ ;
23                  }
 24              }
 25          }
 26          printf(" %d \ n " 、ans);
27      }
 28は     0を返し ます29 }

おすすめ

転載: www.cnblogs.com/fx1998/p/12696428.html