C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での未知数の特定の製品からの最大GCD


2つの整数NとPがあるとします。PはN個の未知の整数の積です。それらの整数のGCDを見つける必要があります。同じ結果が得られる整数の異なるグループが存在する可能性があります。ここでは、すべての可能なグループの中で最大であるGCDを作成します。 N =3、P =24とすると、異なるグループは{1、1、24}、{1、2、12}、{1、3、8}、{1、4、6}、{2 、2、6}、{2、3、4}。 GCDは1、1、1、1、2、1です。したがって、ここで答えは2です。

私たちが好きなテクニックは、gがa 1のGCDであると仮定します 、a 2 、…a n 。その場合、aiはgの倍数であり、Pは(a 1 * a 2 *…*a n )はg n の倍数である必要があります 。答えは、g n となる最大gです。 mod P=0。ここで、P =k1 p1 と仮定します。 * k2 p1 *…*kn pn 。 gはこのような形式である必要があり、gを最大化するには、p iを選択する必要があります。 =p i /N。

#include <iostream>
#include <cmath>
using namespace std;
long getMaxGCD(long n, long p) {
   int count = 0;
   long gcd = 1;
   while (p % 2 == 0) {
      p >>= 1;
      count++; //number of times P divided by 2
   }
   if (count > 0) //if p has some 2s, then
      gcd = gcd* (long)pow(2, count / n);
   for (long i = 3; i <= sqrt(p); i += 2) { //check for all numbers after 2
      count = 0;
      while (p % i == 0) {
         count++;
         p = p / i;
      }
      if (count > 0) {
         gcd = gcd* (long)pow(i, count / n);
      }
   }
   // If n in the end is a prime number
   if (p > 2)
      gcd = gcd* (long)pow(p, 1 / n);
   return gcd;
}
int main() {
   long n = 3;
   long p = 24;
   cout << "MAX GCD: " << getMaxGCD(n, p);
}

出力

MAX GCD: 2

  1. C++で指定された製品のN個の整数の最大GCD

    2つの整数NとPがあるとします。PはN個の未知の整数の積です。これらの整数の可能な最大GCDを見つける必要があります。 N =3、P =24とすると、異なるグループは{1、1、24}、{1、2、12}、{1、3、8}、{1、4、6}、{2 、2、6}、{2、3、4}。 GCDは1、1、1、1、2、1です。したがって、ここで答えは2です。 Pのすべての素因数を見つけて、ハッシュマップに保存します。素因数がすべての整数で共通である場合、N個の整数の最大公約数は最大GCDになります。したがって、P =p 1の場合 k1 * p 2 k2 *…*p n kn 。ここで、piは素因

  2. C ++で指定された角度からの弧の長さ?

    角度 2つの光線が1点で出会うときに形成されます。これらの光線が出会う平面上の点は頂点です。 アーク 円周は、角度で表される円周の一部です。 この問題では、円の角度が与えられます。そして、与えられた円の直径を使用して弧の長さを見つける必要があります。たとえば、 Input : Angle = 45° Diameter = 28 Output : Arc = 11 説明 弧の長さ=(円周)X(角度/ 360°) =(π* d)*(角度/ 360°) 与えられた角度と直径から弧の長さを計算するプログラムを作成するために、この式を適用します。 例 #include <iost