Skip to content

Instantly share code, notes, and snippets.

@rogerioagjr
Last active September 26, 2016 02:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rogerioagjr/ab8980637011f0b7ff26057cb646258c to your computer and use it in GitHub Desktop.
Save rogerioagjr/ab8980637011f0b7ff26057cb646258c to your computer and use it in GitHub Desktop.
Quase primo - F2P2 - OBI 2016
// Quase primo - F2P2 - OBI 2016
// Carlos Vinícius
// Complexidade: O(f(N,K))
// obs* f(a,b) é a quantidade de formas de escolher
// até K primos cujo produto não supera N
#include <bits/stdc++.h>
using namespace std;
#define MAXK 45
int n, k, prime[MAXK];
// Função recursiva que gera todos os subconjuntos dos primos da entrada
// idx = índice do primo que estamos analizando no momento;
// prod = produto dos elementos do subconjunto atual;
// qtd = quantidade de elementos no subconjunto atual
int solve(int idx = 0, int prod = 1, int qtd = 0){
// Se já passei por todos os elementos...
if(idx == k){
// n/prod é a quantidade de múltiplos menores ou iguais a n do produto acumulado
int ret = n/prod;
// Se a quantidade de elementos for ímpar, a quantidade de múltiplos será retirada da resposta
if(qtd%2 == 1){
ret = -ret;
}
// Retorno o resultado
return ret;
}
// O elemento da posição idx pode ou não entrar no subconjunto;
// Primeiramente, não insiro o elemento atual no subconjunto
int ret = solve(idx + 1, prod, qtd);
// Agora, considero a possibilidade de inseri-lo. Observe que se o produto passar de N, não é necessário continuar.
if(prod*1LL*prime[idx] <= n){
ret += solve(idx + 1, prod*prime[idx], qtd + 1);
}
// Retorno o resultado
return ret;
}
int main(){
// leio N e a quantidade de primos
cin >> n >> k;
// leio os primos
for(int i = 0; i < k; i++) cin >> prime[i];
// e calculo o resultado recursivamente
cout << solve() << "\n";
// por fim, retorno zero
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment