sábado, 28 de abril de 2012

Coj - 1259

bueno al fin se me ocurrio la solucion de este problema
#include 
#include 
#include 
using namespace std;

int main()
{
    int n;
    cin >> n;
    int v[]={1,3,9,27,81,43,29,87,61,83,49,47,41,23,69,7,21,63,89,67};

    for(int i =0;i> num;
        int c = 0;
        int indice = 0;



        for (int j = num.size ()-1; j >= 0;j--)
        {

            c = c + v[indice]*((int)num[j]-48);

            indice ++;
            if(indice==19)
            indice =0;


        }


        if ( c % 4 ==0)
        cout << "YES"<< endl;
        else
        cout <<"NO" << endl;


    }


}

miércoles, 25 de abril de 2012

TSHOW2

Luego de investigar como loco Sucesión de Fibonacci  encontre en esta parte algo muy interesante Propiedades de la sucesión
El último dígito de cada número se repite periódicamente cada 60 números. Los dos últimos, cada 300; a partir de ahí, se repiten cada 15\times10^{n-1} números.
#include <iostream>
using namespace std;
int main(){
    long long int vec[63];
    long long int vec2[63];
    vec[1]=0;
    vec[2]=1;
    vec[3]=1;
    vec[4]=2;
    vec[5]=3;
    vec[6]=5;
    vec[7]=8;

    vec2[1]=0;
    vec2[2]=1;
    vec2[3]=1;
    vec2[4]=2;
    vec2[5]=3;
    vec2[6]=5;
    vec2[7]=8;
    for(int i=8; i<61; i++)
    {
        vec[i]=vec[i-2]+vec[i-1];
        vec2[i]=vec[i]%10;
    }
    long long int aux=1,aux2=1;
    int n;
    cin>>n;
    while(n--){
        cin>>aux;
        if(aux<7)
        {
            cout<<vec2[aux]<<endl;
        }
        else
        {
            aux2=aux%60;
            if(aux2==0)
                cout<<1<<endl;
            else
                cout<<vec2[aux2]<<endl;
        }
    }
    return 0;
}

Moraleja revisar las propiedades, si hubiera hecho antes eso me hubiera ahorrado mucho tiempo :xD.

jueves, 19 de abril de 2012

Burrito Amarrado

Problema B  Burrito amarrado

Entrada: burrito.in 
Salida: estándar.
Máxima memoria: 32 MB
Tiempo límite: 10 segundos 
Descripción

 Un burro se encuentra en un corral circular de radio R amarrado con una cuerda mágica a un poste situado en el centro del corral. Inicialmente el burro se encuentra junto al poste y comienza a caminar hacia el norte. La cuerda se pone tensa cuando el burro llega a la mitad del camino entre el poste y el corral. En ese momento el burro da vuelta 90º a la derecha y sigue caminando. De nuevo, la cuerda mágica únicamente le permite llegar hasta la mitad del camino entre el punto donde dio vuelta y el corral. Como el burro quiere escapar, continúa caminando de esta manera hasta que por n-ésima vez la cuerda lo obliga a detenerse. Tu trabajo es determinar la distancia entre el burro y el poste en ese momento. 

Entrada

 Cada caso de entrada consiste de una línea que contiene dos enteros R y n separados por un espacio (1 ≤ R, n ≤ 10000). La última línea de la entrada contiene dos ceros, ese caso no debe procesarse. 

Salida

 Para cada caso de entrada, imprime una línea que contenga la distancia entre el burro y el poste con 2 decimales de precisión.

Ejemplo de entrada
 
120 1
120 4
0 0

Ejemplo de salida
 
60.00
40.69


Solucion

Bueno en este problema se soluciona teniendo en cuenta que habran cuatro casos ya que gira en 0, 90 , 180 , 270 grados. 

El valor de X y de Y se altera sumando o restan la distancia del punto actual al corral de esta manera 

y = (y +  sqrt(r*r-x*x))/2;
 x = (x +  sqrt(r*r-y*y))/2;
 y = (y -  sqrt(r*r-x*x))/2;
 x = (x -  sqrt(r*r-y*y))/2;

de acuerdo a los cuatro casos y a los signos en ellos.
finalmente 
se usa el teorema de pitagoras para mostrar
la hipotenusa.


#include 
#include 
#include 
using namespace std;

int main()
{
    int r;
    int n;
    cin >> r;
    cin >> n;
    while(r+n!=0 )
    {

        double x=0.0;
        double y=0.0;
        while(n--)
        {
            if (n%4==1) y = (y +  sqrt(r*r-x*x))/2;
            if (n%4==2) x = (x +  sqrt(r*r-y*y))/2;
            if (n%4==3) y = (y -  sqrt(r*r-x*x))/2;
            if (n%4==0) x = (x -  sqrt(r*r-y*y))/2;

        }
        cout.precision(2);

        cout << fixed << sqrt(x*x+y*y) <> r;
        cin >> n;

    }

}

domingo, 15 de abril de 2012

UVa - 10132 - File Fragmentation

#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    int nroCasos ;
    string linea;

    getline(cin,linea);
    nroCasos = atoi(linea.data());
    getline(cin,linea);
    while(nroCasos--)
    {
        int totalLetras = 0 ;
        vector<string> datos;
        while(getline(cin,linea) && !linea.empty())
        {
            totalLetras += linea.size();
            datos.push_back(linea);
        }
        int tamdatos = datos.size();

        int longitudSol = totalLetras/(tamdatos/2);

        //fout << "POSIBLES SOLUCIONES"<<endl;
        vector<string> solucion;
        for(int i = 0; i<tamdatos; i++)
            for(int j = i+1; j < tamdatos; j++)
                if(datos[i].size()+datos[j].size() == longitudSol)
                    solucion.push_back(datos[i]+datos[j]),solucion.push_back(datos[j]+datos[i]);

        tamdatos = solucion.size();
        int marcas[tamdatos];
        for(int i = 0; i<tamdatos; i++)
            marcas[i] = 0;
        string sol ;
        int may = -1 ;
        for(int i = 0; i<tamdatos; i++)
            if(marcas[i]==0)
            {
                for(int j = i; j < tamdatos; j++)
                    if(solucion[i].compare(solucion[j])==0)
                        marcas[j]=1, marcas[i]++;

                if(marcas[i]>may)
                    may = marcas[i],sol =  solucion[i];
            }
        cout<<sol<<endl;
        if(nroCasos!=0)
            cout<<endl;
    }
    return 0;
}

UVa - 10188 - Automated Judge Script

#include <iostream>
#include <algorithm>
#include <ctype.h>
using namespace std;
string soloNumeros(string cad)
{
    string sol = "";
    for(int i = 0; i < cad.size(); i++)
        if(isdigit(cad[i]))
            sol+=cad[i];
    return sol;
}
int main(int argc, char *argv[])
{
    int a,b;
    int nrocaso = 1;
    string linea;
    while(getline(cin,linea))
    {
        a = atoi(linea.data());
        if(a == 0)
            return 0;
        string cadsA="";
        for(int i = 0 ; i<a; i++)
        {
            getline(cin,linea);
            cadsA +=linea+'\n';
        }
        getline(cin,linea);
        b = atoi(linea.data());
        string cadsB="";
        for(int i = 0 ; i<b; i++)
        {
            getline(cin,linea);
            cadsB += linea+'\n';
        }
        cout<< "Run #"<<nrocaso<<": ";
        if(cadsA.compare(cadsB) == 0)
            cout << "Accepted"<<endl;
        else{
            string numsA,numsB;
            numsA = soloNumeros(cadsA);
            numsB = soloNumeros(cadsB);
            if(numsA.compare(numsB)==0)
                cout << "Presentation Error"<<endl;
            else
                cout<< "Wrong Answer"<<endl;
        }
        nrocaso++;
    }
    return 0;
}

UVa - 850 - Crypt Kicker II

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
//#include <fstream>
using namespace std;
string cad = "the quick brown fox jumps over the lazy dog";
int tamcad = cad.size();
int cantespacios = 0;
vector<int> lugares[100];
int tamlug=0;
char reemplazos['z'+1];
void cargar()
{
    cantespacios = count(cad.begin(),cad.end(),' ');
    tamcad = cad.size();
    bool contado[tamcad] ;
    for(int i = 0 ; i<tamcad; i++)contado[i] = false;
    for(int i = 0 ; i<tamcad ; i++)
        if(!contado[i])
        {
            contado[i] = true;
            lugares[tamlug].push_back(i);
            for(int j = i+1 ; j<tamcad; j++)
                if(cad[j]== cad[i])
                {
                    contado[j] = true;
                    lugares[tamlug].push_back(j);
                }
            tamlug++;
        }
}
bool esEncriptado(string candidato)
{

    int tam = candidato.size();
    if(tam != tamcad)
        return false;
    if(count(candidato.begin(),candidato.end(),' ') == cantespacios)
    {
        vector<int> lugarescandid[100];
        bool contado[tamcad];
        for(int i = 0 ; i<tamcad; i++)contado[i] = false;
        int tamlugcandi=0;
        for(int i = 0 ; i<tamcad ; i++)
            if(!contado[i])
            {
                contado[i] = true;
                lugarescandid[tamlugcandi].push_back(i);
                for(int j = i+1 ; j<tamcad; j++)
                    if(candidato[j]== candidato[i])
                    {
                        contado[j] = true;
                        lugarescandid[tamlugcandi].push_back(j);
                    }
                tamlugcandi++;
            }
        if(tamlugcandi!=tamlug)
            return false;
        for(int i = 0; i<tamlug ; i++)
        {
            if(lugares[i].size()!=lugarescandid[i].size())
                return false;
            for(int j = 0; j<lugares[i].size(); j++)
                if(lugares[i][j]!=lugarescandid[i][j])
                    return false;
            for(int j = 0; j<tamcad ; j++)
                reemplazos[candidato[j]] = cad[j];
            return true;
        }
    }
    return false;
}
int main()
{
    //ifstream fin("entrada.txt");
    //ofstream fout("salida.txt");
    cargar();
    int cantcasos;
    cin>> cantcasos;
    string linea;
    getline(cin,linea);
    getline(cin,linea);
    while(cantcasos--)
    {
        vector<string> conjunto;
        while(getline(cin,linea))
            if(linea.compare("")!=0)
                conjunto.push_back(linea);
            else
                break;
        bool sw = false;
        for(int i = 0 ; i<conjunto.size(); i++)
            if(esEncriptado(conjunto[i]))
            {
                sw = true;
                break;
            }
        //cout << "tamaño del conjunto = "<< conjunto.size()<<endl;
        if(sw)
        {
            for(int i = 0 ; i<conjunto.size(); i++)
            {
                //cout << "linea a reemplazar = "<< conjunto[i]<<endl;
                for(int j = 0 ; j<conjunto[i].size(); j++)
                    cout << reemplazos[conjunto[i][j]];
                cout <<""<< endl;
            }
        }
        else
            cout << "No solution."<<endl;
        if(cantcasos!=0)
            cout <<endl;
    }
    return 0;
}

jueves, 12 de abril de 2012

UVa - 10252 - Common Permutation

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    string a,b,aux;
    int tama,tamb;
    while(getline(cin,a) && getline(cin,b))
    {
        tama = a.size();
        tamb = b.size();
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        string sol = "";
        int i ,j = 0;
        for(i = 0; i<tama && j<tamb; i++)
            while(j<tamb && a[i]>=b[j])
            {
                if(b[j]==a[i])
                {
                    sol += a[i];
                    j++;
                    break;
                }
                j++;
            }
        cout << sol<<endl;
    }
    return 0;
}

UVa - 10010 Where's Waldorf?

#include <iostream>

using namespace std;
int m,n;
string abuscar;
int tamcad;
bool buscarH(int f,int c, string mapa[])
{
    //derecha
    int fin = c+tamcad-1;
    if(fin<n)
    {
        int i,j;
        for(i = c,j=0 ; i<=fin ; i++,j++)
            if(abuscar[j]!=mapa[f][i])
                break;
        if(i-1 == fin)
            return true;
    }
    //izquierda
    fin = c-tamcad+1;
    if(fin>=0)
    {
        int i,j;
        for(i = c,j=0 ; i>=fin ; i--,j++)
            if(abuscar[j]!=mapa[f][i])
                break;
        if(i+1 == fin)
            return true;
    }
    return false;
}
bool buscarV(int f,int c, string mapa[])
{
    //abajo
    int fin = f+tamcad-1;
    if(fin<m)
    {
        int i,j;
        for(i = f,j=0 ; i<=fin ; i++,j++)
            if(abuscar[j]!=mapa[i][c])
                break;
        if(i-1 == fin)
            return true;
    }
    //arriba
    fin = f-tamcad+1;
    if(fin>=0)
    {
        int i,j;
        for(i = f,j=0 ; i>=fin ; i--,j++)
            if(abuscar[j]!=mapa[i][c])
                break;
        if(i+1 == fin)
            return true;
    }
    return false;
}
bool buscarS(int f,int c, string mapa[])
{
    //derecha y arriba
    int finh = c+tamcad-1;
    int finv = f-tamcad+1;
    if(finh<n && finv>=0 )
    {
        int i,j,k;
        for(i = c,k = f,j=0 ; i<=finh && k>=finv ; i++,j++,k--)
            if(abuscar[j]!=mapa[k][i])
                break;
        if(i-1 == finh && k+1==finv)
            return true;
    }
    //izquierda y abajo
    finh = c-tamcad+1;
    finv = f+tamcad-1;
    if(finh>=0 && finv<m)
    {
        int i,j,k;
        for(i = c,j=0, k=f ; i>=finh  && k<=finv; i--,j++,k++)
            if(abuscar[j]!=mapa[k][i])
                break;
        if(i+1 == finh && k-1==finv)
            return true;
    }
    return false;
}
bool buscarB(int f,int c, string mapa[])
{
    //derecha y abajo
    int finh = c+tamcad-1;
    int finv = f+tamcad-1;
    if(finh<n && finv<m)
    {
        int i,j,k;
        for(i = c,j=0,k=f ; i<=finh & k<=finv; i++,j++,k++)
            if(abuscar[j]!=mapa[k][i])
                break;
        if(i-1 == finh && k-1==finv)
            return true;
    }
 
    //izquierda y arriba
    finh = c-tamcad+1;
    finv = f-tamcad+1;
    if(finh>=0 && finv>=0)
    {
        int i,j,k;
        for(i = c,j=0,k=f ; i>=finh && k>=finv ; i--,j++,k--)
            if(abuscar[j]!=mapa[k][i])
                break;
        if(i+1 == finh && k+1==finv)
            return true;
    }
 
    return false;
}
void buscar(string mapa[])
{
    int i,j;
 
    for(i=0; i < m; i++)
        for(j = 0; j < n; j++)
            if(buscarH(i,j,mapa) || buscarV(i,j,mapa) || buscarS(i,j,mapa) || buscarB(i,j,mapa))
            {
                cout << i+1<<" "<<j+1<<endl;
                return;
            }
}
int main()
{
    int casos,i,j,cb;
    cin>>casos;
    while(casos--)
    {
        cin >> m>>n;
        string mapa[m];
        for(i = 0; i<m; i++)
            cin>>mapa[i];
        for(i=0; i < m; i++)
            for(j = 0; j < n; j++)
                mapa[i][j] &= 95;
        cin>>cb;
        while(cb--)
        {
            cin>>abuscar;
            tamcad = abuscar.size();
            for(i=0; i < tamcad; i++)
                abuscar[i] &= 95;
            buscar(mapa);
        }
        if(casos>0)
            cout << endl;
    }
    return 0;
}

miércoles, 11 de abril de 2012

Project Euler 49

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <stdlib.h>
using namespace std;
bool esPrimo(int n)
{
    if((n&1)==0)
        return (n==2);
    double raiz = sqrt(n);
    for(int i = 3; i<=raiz ; i+=2)
        if((n%i) == 0)
            return false;
    return true;
}
string parseString(int n)
{
    string sol = "";
    while(n>0)
        sol = (char)((n%10)+'0')+sol , n/=10;
    return sol;
}
bool esValido(string cad)
{
    for(int i= 0 ; i<cad.size(); i++)
        if(cad[i]=='0')
            return false;
    return true;
}
int main()
{

    bool probados[10000]= {false};
    for(int n = 1488; n<=9999; n++)
    {
        if(!probados[n])
        {
            string num = parseString(n);
            if(esValido(num))
            {
                vector<int> permutaciones;
                do
                {
                    int ent = atoi(num.data());
                    probados[ent] = true;
                    permutaciones.push_back(ent);

                }
                while(next_permutation(num.begin(),num.end()));

                int nroPer =permutaciones.size();
                for(int i = nroPer; i>=2 ; i--)
                    if(esPrimo(permutaciones[i]))
                        for(int j= i-1; j>=1 ; j--)
                            if(esPrimo(permutaciones[j]))
                                for(int k = j-1; k>=0; k--)
                                    if(esPrimo(permutaciones[k]))
                                        if(permutaciones[i]-permutaciones[j] == permutaciones[j]-permutaciones[k])
                                        {
                                            cout << permutaciones[k];
                                            cout << permutaciones[j];
                                            cout << permutaciones[i]<<endl;
                                            return 0;
                                        }
            }
        }
    }
    return 0;
}

Project Euler 48

import java.math.BigInteger;
public class Main {
 public static void main(String[] args) {
  BigInteger res = BigInteger.ONE;
  BigInteger modu = new BigInteger("10000000000");
  for (int i = 2; i <= 1000; i++) 
   res = res.add(new BigInteger(i+"").modPow(new BigInteger(i+""), modu));
  System.out.println(res.mod(modu));
 }
}

Project Euler 47

#include <iostream>
#include <vector>
#include <set>
using namespace std;

bool Factorizar(int n,int nrofactores,vector<int>* factores)
{
    int i;
    int cant = 0;
    for(i = 2; n>1 ; i++)
        if((n%i) == 0 )
        {
 
            cant++;
            if(cant>nrofactores)
                return false;
            int factor =i;
            n/=i;
            while((n%i) == 0)
                n/=i ,factor*=i;
            factores->push_back(factor);
        }
    return (cant==nrofactores);
}
int main()
{
    int ini = 1;
    vector<int> a,b,c,d;
    bool swa,swb,swc,swd;
    swa =swb=swc=swd = false;
    while(true)
    {
        swa = swb;
        swb = swc;
        swc = swd;
        a.swap(b);
        b.swap(c);
        c.swap(d);
        d.clear();
        swd = Factorizar(ini,4,&d);
        //cout <<ini<<" = " << swa <<" "<< swb <<" "<< swc <<" "<< swd <<endl;
        if(swa && swb && swc && swd)
        {
            set<int> miset(a.begin(),a.end());
            miset.insert(b.begin(),b.end());
            miset.insert(c.begin(),c.end());
            miset.insert(d.begin(),d.end());
            if(miset.size()==16)
            {
                cout << ini<<endl;
                return 0;
            }
        }
        ini++;
    }
    return 0;
}

Project Euler 46

#include <iostream>
#include <cmath>
#define LIM 10000
using namespace std;
int primos[5000]={0};
bool criba[LIM+1]={false};
int cantPrimos = 1;
void generarCriba(){
    int i,j;
    double raiz = sqrt(LIM);
    for(i = 4 ; i<=LIM ;i+=2)
        criba[i] = true;
    for(i = 3 ; i<=raiz;i+=2)
        if(!criba[i])
            for(j = i+i ; j<=LIM ; j+=i)
                criba[j] = true;
    primos[0] = 2;

    for(i = 3; i<=LIM;i+=2)
        if(!criba[i])
            primos[cantPrimos++] = i;
}
bool sePuedeEscribir(int n){
    if(!criba[n])
        return true;
    int i;
    for(i = 0; i<cantPrimos && primos[i]+2 <= n; i++){
        int p = 1;
        int var;
        while((var=(primos[i]+(2*p*p)))<=n){
            if(var==n)
                return true;
            p++;
        }
    }
    return false;
}
int main()
{
    generarCriba();
    int n = 33;
    while(true){
        if(!sePuedeEscribir(n)){
            cout << n<< endl ; return 0;
        }
            n+=2;
    }
    return 0;
}

Project Euler 45

#include <iostream>
#include <cmath>
using namespace std;
int incr = 286;
int s = 40755;
bool esTriangular(int n)
{
    while(s<n)
        s+=incr, incr++;
    return s == n;
}
bool esPentagonal(int x)
{
    double n = (sqrt(24.0*x + 1)+1)/6.0;
    return n==floor(n);
}
int main()
{
    int hexa;
    int id=144 ;
    while(true)
    {
        hexa = id*(2*id -1 );
        if(esPentagonal(hexa) && esTriangular(hexa))
        {
            cout << hexa<<endl;
            return 0;
        }
        id++;
    }
    return 0;
}

martes, 10 de abril de 2012

Project Euler 44

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
bool esPentagonal(int x)
{
    double n = (sqrt(24.0*x + 1)+1)/6.0;
    return n==floor(n);
}
int obtPent(int n)
{
    return (n*(3*n-1))/2;
}
int main()
{
    vector<int> pentagonals;
    pentagonals.push_back(1);
    bool sw = true;
    int pent,resta;
    int k = 2;
    while(sw)
    {
        pent = obtPent(k);
        vector<int>::iterator it = pentagonals.begin();
        while(it != pentagonals.end())
        {
            resta = pent - (*it);
            if(esPentagonal(resta))
                if(esPentagonal(pent+(*it)))
                {
                    cout<<resta<<endl;
                    return 0;
                }
            it++;
        }
        pentagonals.push_back(pent);
        k++;
    }
    return 0;
}

Project Euler 43

#include <iostream>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int primos[8] = {2,3,5,7,11,13,17};
int main()
{
    string ini = "0123456789";
    string fin = "9876543210";
    unsigned long long int suma = 0 ;
    while(ini.compare(fin)!=0)
    {
        bool sw = true;
        for(int i = 7; i >= 1 && sw; i--)
            sw = ((((ini[i]-'0')*100+(ini[i+1]-'0')*10+(ini[i+2]-'0'))%primos[i-1])==0);
        if(sw)
            suma += atof(ini.data());

        next_permutation(ini.begin(),ini.end());
    }
    cout <<suma << endl;
    return 0;
}

Project Euler 42

#include <iostream>
#include <fstream>
using namespace std;
bool esT[200];
void generarTrian()
{
    for(int i = 0 ; i<200; i++)esT[i] = false;
    int s = 1;
    for(int c = 2; s<200; c++)
    {
        esT[s] = true;
        s += c;
    }
}
int main()
{
    generarTrian();
    ifstream fin("words.txt");
    string cad ;
    fin >> cad;
    cad += ",";
    int maxi = 0;
    int a,b;
    a = 0;
    b = -1;
    for(int i = 1 ; i<cad.size(); i++)
    {
        while(i<cad.size() and cad[i]!=',')
            i++;
        a = b+1;
        b = i;
        int tmp = 0 ;
        for(int j = a+1; j<b-1; j++)
            tmp += (cad[j]-'A'+1);

        if(esT[tmp])
            maxi++;
    }
    cout << maxi << endl;
    return 0;
}

Project Euler 41

#include <iostream>
#include <algorithm>
using namespace std;
const int n= 7654322;
bool esPrimo[n+1];
void generarCriba()
{
    for(int i = 3 ; i <= n; i+=2)
        esPrimo[i] = true;
    for(int i = 4 ; i <= n; i+=2)
        esPrimo[i] = false;
    esPrimo[2] = true;
    for(int i = 3; i*i <= n; i+=2)
        if(esPrimo[i])
            for(int j = i+i ; j <= n; j+=i)
                esPrimo[j] = false;
}
int main()
{
    generarCriba();
    string ini = "7654321";
    string fin = "1234567";
    int i = 0 ;
    while(ini.compare(fin)!=0)
    {
        if(((ini[6]-'0')&1)!=0)
            if(esPrimo[atoi(ini.data())])
            {
                cout << ini << endl;
                break;
            }
        prev_permutation(ini.begin(),ini.end());
    }
    return 0;
}

Project Euler 37

#include <iostream>
#include <bitset>
#include <math.h>
using namespace std;
bool esPrimo(int n)
{
    if(n==1)
        return false;
    for(int i = 2; i*i<=n; i++)
        if(n%i==0)
            return false;
    return true;
}

bool esCPI(int n)
{
    int nc = 10;
    while(nc<n)
    {
        if(!esPrimo(n%nc))
            return false;
        nc *= 10;
    }
    return true;
}
int main()
{

    int ini=0,fin=0;
    int term[] = {1,3,7,9};
    int td[100]= {2,3,5,7};

    int pos=4;
    ini = 0;
    fin = 3;
    for(int cd = 1; cd<=9; cd++)
    {
        for(int i=ini ; i<=fin; i++)
        {
            for(int t = 0 ; t<=3; t++)
            {
                int ope = td[i]*10+term[t];
                if(esPrimo(ope))
                    td[pos++] = ope;
            }
        }
        ini = fin+1;
        fin = pos-1;
    }
    int sum = 0 ,cant = 0;
    for(int i = 4; i<=fin ; i++)
        if(esCPI(td[i]))
        {
            cout << td[i] << endl;
            sum += td[i];
            cant++;
        }
    cout << "cantidad total = "<<cant<<endl;
    cout << "resultado final = "<<sum<<endl;
    return 0;
}

Project Euler 36

#include <iostream>
#include <string>
using namespace std;
bool esPalindrome(string cad)
{
    int i,j;
    i = 0;
    j = cad.size()-1;
    while(i<j)
        if(cad[i++]!=cad[j--])
            return false;
    return true;
}
string abase2(int n)
{
    string sol = "";
    while(n>0)
        sol = (char)((n&1)+'0')+sol , n >>= 1;
    return sol;
}
string aString(int n)
{
    string sol = "";
    while(n>0)
    {
        int d = n%10;
        sol = (char)(d+'0')+sol;
        n /= 10;
    }
 
    return sol;
}
int main()
{
//872187
    int suma = 0 ;
    const int n = 1000000;
    for(int i = 1; i < n; i+=2)
        if(esPalindrome(aString(i)) && esPalindrome(abase2(i)))
            suma += i;
    cout << suma << endl;
    return 0;
}

Project Euler 35

#include <iostream>
#include <bitset>
using namespace std;
const int n = 1000000;
bitset<n+1> criba;
void generarCriba()
{
    criba[0] = criba[1] = true;
    for(int i = 2 ; i*i<=n; i++)
        if(!criba[i])
            for(int j = i+i; j<=n; j +=i )
                criba[j]= true;

}
int main()
{
    generarCriba();
    int cont = 4;//2,3,5,7 ya cuentan como primos circulares
    int cc = 1;
    int sncc= 100;
    int nc = 10;
    for(int i = 10 ; i<n; i++)
    {
        if(i==sncc)
        {
            cc++;
            sncc *=10;
            nc *= 10;
        }
        if(!criba[i])
        {
            int num = i;
            int c = 0;

            for(int u = 1 ; u<=cc; u++)
            {
                int d = num%10;
                num /= 10;
                num = (d*nc+num);
                if(!criba[num])
                    c++;
                else
                    break;
            }

            if(c == cc)
                cont++;
        }
    }
    cout <<"Resultado final = "<< cont<< endl;
    return 0;
}

Project Euler 34

#include <iostream>

using namespace std;

int main()
{
    int sum = 0 ;
    int fac[10] = {1,1,2};
    for(int i = 3; i<=9; i++)
        fac[i] = i*fac[i-1];
    int num = 0;
    int n[5]= {0};
    for(n[0] = 0 ; n[0]<10 ; n[0]++)
        for(n[1] = 0 ; n[1]<10 ; n[1]++)
            for(n[2] = 0 ; n[2]<10 ; n[2]++)
                for(n[3] = 0 ; n[3]<10 ; n[3]++)
                    for(n[4]= 0 ; n[4]<10 ; n[4]++)
                    {
                        int pos = 0 ;
                        while(pos <=4 && n[pos]==0)
                            pos++;
                        if(fac[n[0]]+fac[n[1]]+fac[n[2]]+fac[n[3]]+fac[n[4]]-pos==num)
                        {
                            cout << n[0] << "! + ";
                            cout << n[1] << "! + ";
                            cout << n[2] << "! + ";
                            cout << n[3] << "! + ";
                            cout << n[4] << "! = " << num<< endl;

                            sum += num;
                        }
                        num++;
                    }
    cout << sum-3<< endl;
    /*Le restamos 3 por que en el enunciado
      indica que no hay que sumar 1! = 1 y 2! = 2
        */
    return 0;
}

Project Euler 33

#include <iostream>

using namespace std;

int mcd(int a,int b)
{
    int c;
    if(b>a)
    {
        c = a;
        a = b;
        b = c;
    }
    c = a%b;
    while(c > 0)
    {
        a = b;
        b = c;
        c = a%b;
    }
    return b;
}

int main()
{
    int mcdiv;
    int de,nu;
    int resultadoden  = 1;
    int resultadonum = 1;
    for(int num = 10; num<=50; num++)
        for(int den = 10; den <= 99 ; den++)
        {
            mcdiv = mcd(num,den);
            if(num != den && mcdiv!=1 && mcdiv%10!=0)
            {
                de = den/mcdiv;
                nu = num/mcdiv;
                int dat1[2]= {num/10,num%10};
                int dat2[2]= {den/10,den%10};
                for(int i=0; i<=1; i++)
                    for(int j = 0; j<=1; j++)
                        if(dat1[i]!=0 && dat2[j]!=0 &&
                                dat1[i]%nu==0 &&
                                dat2[j]%de==0 &&
                                (dat1[i]/nu)==(dat2[j]/de) &&
                                (dat1[(i+1)%2]==dat2[(j+1)%2]))
                        {
                            cout << num<<"/"<<den<<" = "<<dat1[i]<<"/"<<dat2[j]<<endl;
                            resultadoden *= den;
                            resultadonum *= num;
                        }
            }
        }
    cout << "Resultado final = "<< resultadoden/mcd(resultadonum,resultadoden) <<endl;

    return 0;
}

Project Euler 32

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <set>
#include <numeric>
using namespace std;
int factorial(int n)
{
    int f  = 1;
    while(n>0)
        f *= n--;
    return f;
}
int main()
{
    set<int> guardar ;
    string cad =  "123456789";
    int tam =  cad.length();
    int n1,n2,n3,i,j;
    int fac = factorial(tam);

    for(int n = 0 ; n < fac; n++)
    {
        for(i = 1 ; i <=(tam-2) ; i++ )
        {
            n1 = atoi(cad.substr(0,i).data());
            for(j = 1 ; j <= (tam-i-1); j++)
            {
                n2 = atoi(cad.substr(i,j).data());
                n3 = atoi(cad.substr(i+j,tam-i+j).data());
                if((n1*n2) == n3)
                {
                    cout << n1 << " x "<<n2 <<" = "<<n3<<endl;
                    guardar.insert(n3);
                }
            }
        }
        next_permutation(cad.begin(),cad.end());
    }
    cout << "Resultado Final = "<<accumulate(guardar.begin(),guardar.end(),0)<<endl;
    return 0;
}