Aiuto su CTF 45/100 per arrivare al 100

Ho provato di fare l’esercizio di Algobadge CTF. Ho provato in vari modi:

  1. Con le Linked List - 30/100
  2. Con gli Array List - 30/100
  3. Con la formula trovata per induzione - 45/100
    Non so cosa inventarmi, aiuto.

Allego il codice contenente la formula.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;
import java.io.PrintWriter;
import java.lang.Math;
public class ctf
{
	public static void main(String[] args) throws FileNotFoundException {
		InputStream fin = new FileInputStream("input.txt");
		OutputStream fout = new FileOutputStream("output.txt");

		Scanner scan = new Scanner(fin);
		PrintWriter prnt = new PrintWriter(fout);

		int q = scan.nextInt();
		for (int i = 0; i < q; i++)
		{
			int teamSize = scan.nextInt();
			prnt.println((2 * (teamSize - (int)Math.pow(2,(int)(Math.log(teamSize) / Math.log(2))))+1));
		}
		prnt.close();
		scan.close();

	}
}

PS
Sono riuscito a farlo. La soluzione è la stessa, bisognava solo sostituire tutto con long.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import java.util.Scanner;
import java.io.PrintWriter;



public class ctf {

    public static long e (long b , long n) {
        if (n == 0)
        {
            return 1;
        }
        long r = e(b,n/2);
        r = r * r;
        if (n %2 == 1)
        {
            r = r * b ;
        }    
        return r;
    }
    
     public static long log2(long N)
    {
 
        // calculate log2 N indirectly
        // using log() method
        long result = (long)(Math.log(N) / Math.log(2));
 
        return result;
    }
    
    public static long solve(int teamSize)
    {
        long exp = log2(teamSize);
        return (2*(teamSize-e(2,exp))+1);
    }
	public static void main(String[] args) throws FileNotFoundException {
		InputStream fin = new FileInputStream("input.txt");
        OutputStream fout = new FileOutputStream("output.txt");

        Scanner scan = new Scanner(fin);
        PrintWriter prnt = new PrintWriter(fout);

        int q = scan.nextInt();
        for (int i = 0; i < q; i++)
        {
           long teamSize = scan.nextLong();
            long result = 2 * (teamSize - e(2, log2(teamSize))) + 1;
            prnt.println(result);
        }

        // Close the resources
        prnt.close();
        scan.close();
		

	}
}

ciao, come hai fatto a capire che quella era la formula corretta? Qual è il procedimento che hai usato? Grazie.

@danilofiorenza

Io per trovare la formula corretta ho fatto a tentativi su un foglio trovando i risultati per alcuni casi semplici.

Alcuni esempi di risultati erano:
(N-Risposta)
2-1
3-3
4-1
5-3
6-5
7-7
8-1
9-3
10-5
11-7
12-9
13-11
14-13
15-15
16-1
17-3

Se osservi attentamente tutti i risultati, riesci a osservare che ogni volta il valore sale di 2, finché non raggiunge una potenza di 2 dove torna a essere 1.
Da qui riesci anche a notare che il numero subito prima di una potenza di 2 è sempre uguale a se stesso.
A questo punto devi solo ingegnarti sui numeri e trovare una formula che corrisponde sempre a questi risultati.