Учитывая число n, найдите n-ое число без квадратов. Число не содержит квадратов, если оно не делится на идеальный квадрат, отличный от 1.
Примеры :
Input : n = 2
Output : 2
Input : 5
Output : 6
There is one number (in range from 1 to 6)
that is divisible by a square. The number
is 4.
Метод 1 (грубая сила):
Идея состоит в том, чтобы итеративно проверять каждое число, делится ли оно на любое идеальное квадратное число, и увеличивать число всякий раз, когда встречается число без квадратов, и возвращать число без n-го квадрата.
Ниже приводится реализация:
C ++
#include<bits/stdc++.h>
using namespace std;
int squareFree( int n)
{
int cnt = 0;
for ( int i=1;; i++)
{
bool isSqFree = true ;
for ( int j=2; j*j<=i; j++)
{
if (i % (j*j) == 0)
{
isSqFree = false ;
break ;
}
}
if (isSqFree == true )
{
cnt++;
if (cnt == n)
return i;
}
}
return 0;
}
int main()
{
int n = 10;
cout << squareFree(n) << endl;
return 0;
}
|
Джава
import java.io.*;
class GFG {
public static int squareFree( int n)
{
int cnt = 0 ;
for ( int i = 1 ; ; i++) {
boolean isSqFree = true ;
for ( int j = 2 ; j * j <= i; j++)
{
if (i % (j * j) == 0 ) {
isSqFree = false ;
break ;
}
}
if (isSqFree == true ) {
cnt++;
if (cnt == n)
return i;
}
}
}
public static void main(String[] args) {
int n = 10 ;
System.out.println( "" + squareFree(n));
}
}
|
python3
def squareFree(n):
cnt = 0 ;
i = 1 ;
while ( True ):
isSqFree = True ;
j = 2 ;
while (j * j < = i):
if (i % (j * j) = = 0 ):
isSqFree = False ;
break ;
j + = 1 ;
if (isSqFree = = True ):
cnt + = 1 ;
if (cnt = = n):
return i;
i + = 1 ;
return 0 ;
n = 10 ;
print (squareFree(n));
|
C #
using System;
class GFG {
public static int squareFree( int n)
{
int cnt = 0;
for ( int i = 1; ; i++)
{
bool isSqFree = true ;
for ( int j = 2; j * j <= i; j++)
{
if (i % (j * j) == 0) {
isSqFree = false ;
break ;
}
}
if (isSqFree == true ) {
cnt++;
if (cnt == n)
return i;
}
}
}
public static void Main()
{
int n = 10;
Console.Write( "" + squareFree(n));
}
}
|
PHP
<?php
function squareFree( $n )
{
$cnt = 0;
for ( $i = 1; ; $i ++)
{
$isSqFree = true;
for ( $j = 2; $j * $j <= $i ; $j ++)
{
if ( $i % ( $j * $j ) == 0)
{
$isSqFree = false;
break ;
}
}
if ( $isSqFree == true)
{
$cnt ++;
if ( $cnt == $n )
return $i ;
}
}
return 0;
}
$n = 10;
echo (squareFree( $n ));
?>
|
Выход:
14
Метод 2 (лучший подход):
Идея состоит в том, чтобы считать свободные квадратные числа, меньшие или равные верхнему пределу «k», и затем применить бинарный поиск, чтобы найти n-е квадратное свободное число. Сначала мы вычисляем количество квадратов (числа с квадратами в качестве коэффициентов) до «k», а затем вычитаем это количество из общего числа, чтобы получить количество свободных квадратов до «k».
Объяснение:
- Если любое целое число имеет идеальный квадрат как фактор, то гарантируется, что у него также есть квадрат простого числа как фактор. Таким образом, нам нужно посчитать целые числа, меньшие или равные «k», у которых квадрат простых чисел является фактором.
Например, найдите число целых чисел, которые имеют 4 или 9 в качестве коэффициента до «k». Это может быть сделано с использованием принципа включения-исключения . Используя принцип включения-исключения , общее число целых чисел составляет [k / 4] + [k / 9] — [k / 36], где [] — наибольшая целочисленная функция. - Рекурсивно применяйте включение и исключение, пока значение наибольшего целого не станет равным нулю. Этот шаг вернет количество чисел с квадратами в качестве факторов.
- Примените бинарный поиск, чтобы найти номер n-го квадрата.
Ниже приведена реализация вышеуказанного алгоритма:
C ++
#include<bits/stdc++.h>
using namespace std;
const int MAX_PRIME = 100000;
const int MAX_RES = 2000000000l;
void SieveOfEratosthenes(vector< long long > &a)
{
bool prime[MAX_PRIME + 1];
memset (prime, true , sizeof (prime));
for ( long long p=2; p*p<=MAX_PRIME; p++)
{
if (prime[p] == true )
{
for ( long long i=p*2; i<=MAX_PRIME; i += p)
prime[i] = false ;
}
}
for ( long long p=2; p<=MAX_PRIME; p++)
if (prime[p])
a.push_back(p);
}
long long countSquares( long long i, long long cur,
long long k, vector< long long > &a)
{
long long square = a[i]*a[i];
long long newCur = square*cur;
if (newCur > k)
return 0;
long long cnt = k/(newCur);
cnt += countSquares(i+1, cur, k, a);
cnt -= countSquares(i+1, newCur, k, a);
return cnt;
}
long long squareFree( long long n)
{
vector < long long > a;
SieveOfEratosthenes(a);
long long low = 1;
long long high = MAX_RES;
while (low < high)
{
long long mid = low + (high - low)/2;
long long c = mid - countSquares(0, 1, mid, a);
if (c < n)
low = mid+1;
else
high = mid;
}
return low;
}
int main()
{
int n = 10;
cout << squareFree(n) << endl;
return 0;
}
|
Джава
import java.util.*;
class GFG
{
static int MAX_PRIME = 100000 ;
static int MAX_RES = 2000000000 ;
static void SieveOfEratosthenes(Vector<Long> a)
{
boolean prime[] = new boolean [MAX_PRIME + 1 ];
Arrays.fill(prime, true );
for ( int p = 2 ; p * p <= MAX_PRIME; p++)
{
if (prime[p] == true )
{
for ( int i = p * 2 ; i <= MAX_PRIME; i += p)
prime[i] = false ;
}
}
for ( int p = 2 ; p <= MAX_PRIME; p++)
if (prime[p])
a.add(( long )p);
}
static long countSquares( long i, long cur,
long k, Vector<Long> a)
{
long square = a.get(( int ) i)*a.get(( int )(i));
long newCur = square*cur;
if (newCur > k)
return 0 ;
long cnt = k/(newCur);
cnt += countSquares(i + 1 , cur, k, a);
cnt -= countSquares(i + 1 , newCur, k, a);
return cnt;
}
static long squareFree( long n)
{
Vector <Long> a = new Vector<>();
SieveOfEratosthenes(a);
long low = 1 ;
long high = MAX_RES;
while (low < high)
{
long mid = low + (high - low)/ 2 ;
long c = mid - countSquares( 0 , 1 , mid, a);
if (c < n)
low = mid+ 1 ;
else
high = mid;
}
return low;
}
public static void main(String[] args)
{
int n = 10 ;
System.out.println(squareFree(n));
} }
|
C #
using System;
using System.Collections.Generic;
class GFG
{
static int MAX_PRIME = 100000;
static int MAX_RES = 2000000000;
static void SieveOfEratosthenes(List< long > a)
{
bool []prime = new bool [MAX_PRIME + 1];
for ( int i = 0; i < MAX_PRIME + 1; i++)
prime[i] = true ;
for ( int p = 2; p * p <= MAX_PRIME; p++)
{
if (prime[p] == true )
{
for ( int i = p * 2; i <= MAX_PRIME; i += p)
prime[i] = false ;
}
}
for ( int p = 2; p <= MAX_PRIME; p++)
if (prime[p])
a.Add(( long )p);
}
static long countSquares( long i, long cur,
long k, List< long > a)
{
long square = a[( int ) i]*a[( int )(i)];
long newCur = square * cur;
if (newCur > k)
return 0;
long cnt = k/(newCur);
cnt += countSquares(i + 1, cur, k, a);
cnt -= countSquares(i + 1, newCur, k, a);
return cnt;
}
static long squareFree( long n)
{
List< long > a = new List< long >();
SieveOfEratosthenes(a);
long low = 1;
long high = MAX_RES;
while (low < high)
{
long mid = low + (high - low)/2;
long c = mid - countSquares(0, 1, mid, a);
if (c < n)
low = mid + 1;
else
high = mid;
}
return low;
}
public static void Main()
{
int n = 10;
Console.WriteLine(squareFree(n));
} }
|
Выход:
14
Эта статья предоставлена Рахул Агравал . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
N-й квадрат бесплатный номер
0.00 (0%) 0 votes