Crittografia LWF (lwf)

Похожие документы
GATOR: Testi e Soluzioni dei problemi

Primo allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale

Gestione di files Motivazioni

ASD Lab 1. Alessio Guerrieri UniTN. Alessio Guerrieri (UniTN) ASD Lab / 27

BOZZA. cin per la comunicazione dal dispositivo di input standard, la tastiera, al programma (stream di input standard)

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi seconde

Codifica: dal diagramma a blocchi al linguaggio C++

Le Funzioni e la Ricorsione

Informatica! Appunti dal laboratorio 1!

HOMEWORKS. in modo che il programma stampi N ripetizioni della stringa HelloWorld (su righe diverse), con N inserito dall utente.

Ricerca sequenziale di un elemento in un vettore

Informatica/ Ing. Meccanica/ Prof. Verdicchio/ 14/02/2012 / Foglio delle domande / VERSIONE 1

a.a Codice corso: 21012, HOMEWORKS

Esercizi (semplici algoritmi)

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Esempi di Problemi Iterativi

Le stringhe. Le stringhe

Input / Output attraverso stream. I/O in C vs. I/O in C++

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Linguaggio C++ 8. Matrici

Strutture di iterazione

AA LA RICORSIONE

Definizione di metodi in Java

Indice. La dichiarazione using. Il namespace std della Libreria Standard del C++ std::cin. Le Stringhe in C++ (CAP 3, parte I)

Rappresentazione dell Informazione

Programmazione Procedurale in Linguaggio C++

Corso di Fondamenti di Informatica (M-Z)

Programmazione modulare

Esempio : i numeri di Fibonacci

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

La scrittura di un programma Modellizzazione del programma Scrittura del codice Esercizi. Sperimentazioni I. Alberto Garfagnini, Marco Mazzocco

Indice. Materiale di riferimento. Struttura di un programma in C++ Introduzione al C++ (CAP 1) Alberto Garfagnini e Marco Mazzocco A.A.

Laboratorio di Algoritmi e Strutture Dati

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Informatica Generale Homework di Recupero 2016

Codici a barre. Fondamenti di Informatica B

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Gestione di stringhe. Le stringhe in C/C++

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Corso di Informatica di Base

La codifica digitale

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

0.1 Esercizi calcolo combinatorio

n deve essere maggiore di 0, altrimenti il metodo restituisce null.

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

Prova Scritta del 19/07/10

ISTITUTO TECNICO STATALE COMMERCIALE E PER GEOMETRI A. MARTINI Castelfranco Veneto (TV) Docente: Daniele De Pieri.

Istituto Tecnico Industriale M. M. Milano Polistena. Classe III D a.s. 2015/2016 C++ Guida Base

Note sul Sudoku. Marco Liverani. Dicembre 2005

Tracce. 1. Data una lista di elementi di tipo intero, implementare in C++ le seguenti funzioni

Si dice multiplo di un numero a diverso da zero, ogni numero naturale che si ottiene moltiplicando a per ciascun elemento di N.

Esercizi proposti 10

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

Ambienti di sviluppo integrato

Esercitazione 3. Espressioni booleane I comandi if-else e while

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

1. Soluzione esercizio XYZ SpA

Mini-Corso di Informatica

Kangourou della Matematica 2006 finale nazionale italiana Mirabilandia, 8 maggio 2006

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

Lezione 6 Selection/Insertion Sort su interi e stringhe

In molte applicazioni sorge il problema di sapere in quanti modi possibili si può presentare un certo fenomeno.

Laboratorio di Programmazione Gruppo III, Ml-ZZ. Alberto Finzi

#include <iostream> using namespace std; // int main ( ) { // --- Dichiarazione delle variabili int N ; float A, Pot;

Kangourou della Matematica 2009 finale nazionale italiana Mirabilandia, 11 maggio 2009

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi terza

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Algoritmi e strutture di dati 2

Esercitazione 6. Array

Scrittura formattata - printf

Programmazione Funzionale

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

PROGETTAZIONE TOP-DOWN E BOTTOM-UP

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Транскрипт:

Crittografia LWF (lwf) lwf IT Difficoltà: 1 Luca e William devono sovente scambiarsi delle segretissime informazioni riguardo alle selezioni territoriali, sotto forma di numeri interi N. Per evitare di essere scoperti, hanno quindi deciso di inventare un nuovo codice crittografico, che hanno chiamato codice Luca-William-Fibonacci (LWF). In questo codice, ogni numero intero N viene tradotto in una sequenza s 0 s 1... s k di cifre binarie 0 e 1, di cui l ultima è un 1, in maniera tale che: k N = s i F i i=0 dove F i è il numero di Fibonacci i-esimo. Più informalmente, una cifra 1 in posizione i nella sequenza indica che il numero di Fibonacci i-esimo fa parte della somma che ricostruisce il numero N. La sequenza dei numeri di Fibonacci è definita in maniera ricorsiva: i primi due termini della sequenza sono F 0 = 1 e F 1 = 1, mentre ognuno dei successivi viene calcolato sommando i due precedenti F i = F i 1 + F i 2. Per esempio, consideriamo la sequenza 1011001 di lunghezza k = 7. Fibonacci sono: 1 1 2 3 5 8 13 il numero N corrispondente è pari a 1 + 2 + 3 + 13 = 19. Visto che i primi 7 numeri di Luca ha già implementato l algoritmo di decodifica (descritto come sopra), che da una sequenza di cifre binarie ricostruisce il numero N. Tuttavia William è ancora in alto mare con l algoritmo di codifica, che dato un numero N dovrebbe produrre una sequenza di cifre binarie corrispondente. Implementalo tu! Dati di input Il file input.txt è composto da un unica riga contenente l unico intero N. Dati di output Il file output.txt deve essere composto da un unica riga contenente una sequenza di cifre binarie che termina con 1 corrispondente ad N. Assunzioni 1 N 1 000 000. Potrebbero esserci più sequenze di cifre ugualmente valide. Esempi di input/output input.txt output.txt 19 1011001 9 11101 lwf Pagina 1 di 10

lwf IT Spiegazione Il primo caso di esempio è quello discusso nel testo. Nel secondo caso di esempio, 9 può essere ottenuto sia come 1+1+2+5 (come nell output di esempio), oppure come 1 + 3 + 5 (10011) e 1 + 8 (100001). lwf Pagina 2 di 10

lwf IT Soluzione 1 // Soluzione di lwf 2 // Autore: Edoardo Morassutto 3 // Complessità: O(N) 4 // Breve spiegazione: 5 // Calcolo i numeri di Fibonacci fino ad N (incluso) e dal piu grande 6 // li prendo gready se ci stanno in N e diminuisco. 7 8 #include <iostream> 9 #include <fstream> 10 #include <string> 11 #include <algorithm> 12 13 using namespace std; 14 15 int fib[50]; 16 17 int main() { 18 ifstream in("input.txt"); 19 ofstream out("output.txt"); 20 21 int N; 22 in >> N; 23 24 fib[0] = 1; 25 fib[1] = 1; 26 int i; 27 for (i = 2; fib[i-1]+fib[i-2] <= N; i++) { 28 fib[i] = fib[i-1]+fib[i-2]; 29 } 30 i--; 31 32 string s; 33 while (i >= 0) { 34 if (N >= fib[i]) { 35 s += '1'; 36 N -= fib[i]; 37 } else { 38 s += '0'; 39 } 40 i--; 41 } 42 reverse(s.begin(), s.end()); 43 out << s << endl; 44 } lwf Pagina 3 di 10

Appetito aracnide (tecla) tecla IT Difficoltà: 2 Ape Maya è rimasta intrappolata in un nodo della tela di Tecla, un ragno molto temuto tra le api dell alveare. Tecla si affretta ad afferrarla ma, quando giunge su quel nodo, si accorge di non avere appetito, e dice BLEAH. Va detto che l appetito dei ragni è molto particolare: ogni volta che percorrono un filamento della loro rete, essi invertono lo stato del loro stomaco tra SLURP e BLEAH. Tecla deve quindi farsi un giretto nella rete sperando di tornare da Maya in stato SLURP. La tela di Tecla è composta da N nodi (numerati da 0 a N 1) connessi tra loro da M filamenti. Tecla e Ape Maya all inizio si trovano entrambe nel nodo 0, e ogni filamento può essere attraversato da Tecla in entrambe le direzioni. Aiuta Tecla ad individuare una passeggiata funzionale al buon appetito! Dati di input Il file input.txt è composto da M + 1 righe, contenenti: Riga 1: gli interi N ed M, il numero di nodi e di filamenti della tela. Riga 2..M + 1: due interi separati da spazio u, v; dove u e v identificano i due nodi ai capi del filamento i-esimo. Dati di output Il file output.txt deve essere composto da due righe, contenenti: Riga 1: il numero di spostamenti L che Tecla deve compiere nella sua passeggiata. Riga 2: L + 1 numeri separati da uno spazio, di cui il primo e l ultimo devono essere 0 (nodo di partenza e di arrivo), e gli altri sono i nodi come visitati da Tecla nell ordine (e possono avere ripetizioni). Assunzioni 1 M, N 30. In ogni filamento, u v e sono entrambi compresi tra 0 e N 1. Si garantisce l esistenza di una soluzione: Ape Maya è spacciata! tecla Pagina 4 di 10

tecla IT Esempi di input/output input.txt output.txt 3 3 0 1 1 2 2 0 8 12 0 1 1 2 2 3 3 0 2 4 3 4 4 5 5 6 6 7 7 0 0 5 6 3 3 0 2 1 0 7 0 5 6 3 4 2 3 0 Spiegazione Nel primo caso di esempio, la tela di Tecla è come nella figura seguente, dove il percorso da seguire è evidenziato in rosso: 0 1 2 Nel secondo caso di esempio, la tela e il percorso sono: 7 6 0 1 5 3 2 4 tecla Pagina 5 di 10

tecla IT Soluzione 1 /* solutore oddcycle 2 Romeo 2017-03-15 3 */ 4 5 #include <iostream> 6 #include <cassert> 7 #include <vector> 8 10 9 #define DEBUG 0 11 using namespace std; 12 13 const unsigned MAXN = 30; 14 int seen[maxn]; 15 int sex[maxn]; 16 int cycle[maxn], posw = 0; 17 18 int N, M, L; 19 vector<int> adj[maxn]; 20 21 bool odd_cycle(int node, int mysex) { 22 if ( seen[node] ) { 23 if ( sex[node]!= mysex ) { 24 cycle[posw++] = node; 25 L = posw; 26 return true; 27 } 28 else 29 return false; 30 } 31 seen[node] = 1; 32 sex[node] = mysex; 33 cycle[posw++] = node; 34 for (int next: adj[node]) 35 if ( odd_cycle(next, 1-mysex) ) 36 return true; 37 posw--; 38 return false; 39 } 40 41 int main() { 42 assert(freopen("input.txt", "r", stdin)); 43 assert(freopen("output.txt", "w", stdout)); 44 45 cin >> N >> M; 46 tecla Pagina 6 di 10

tecla IT 47 for (int i=0; i<m; i++) { 48 int a, b; 49 cin >> a >> b; 50 adj[a].push_back( b ); 51 adj[b].push_back( a ); 52 } 53 54 assert( odd_cycle(0, 0) ); 55 56 int visitedtwice = cycle[l-1]; 57 bool repeat = false; 58 for (int i=l-2; i >= 0; i--) { 59 if ( repeat ) 60 cycle[l++] = cycle[i]; 61 if ( cycle[i] == visitedtwice ) 62 repeat = true; 63 } 64 65 cout << L-1 << endl; 66 for (int i=0; i<l; i++) 67 cout << cycle[i] << " "; 68 cout << endl; 69 70 return 0; 71 } tecla Pagina 7 di 10

Sport intellettuali (scommessa) scommessa IT Difficoltà: 2 Romeo è un grande appassionato di sport intellettuali, e adora ritrovarsi con gli amici per seguire le competizioni internazionali più avvincenti di questo tipo. Di recente, il gruppo di amici si è appassionato a uno sport molto particolare. In questo gioco, un mazzo di carte numerate da 0 a N 1 (dove N è dispari) viene prima mescolato, e poi le carte vengono affiancate in linea retta sul tavolo. Ai telespettatori, per aumentare la suspence, vengono mostrati i numeri delle carte C 0, C 1,..., C i,..., C N 1 nell ordine così ottenuto. A questo punto i giocatori 1 possono scoprire due carte disposte consecutivamente sul tavolo, e prenderle nel solo caso in cui queste due carte abbiano somma dispari. Se queste carte vengono prese, le altre vengono aggiustate quanto basta per riempire il buco lasciato libero. Il gioco prosegue quindi a questo modo finché nessun giocatore può più prendere carte. Romeo e i suoi amici, per sentirsi più partecipi, hanno oggi deciso di fare un gioco nel gioco : all inizio della partita, scommettono su quali carte pensano rimarranno sul tavolo una volta finita la partita. Aiuta Romeo, determinando quali carte potrebbero rimanere sul tavolo alla fine del gioco! Una carta potrebbe rimanere sul tavolo a fine gioco, se esiste una sequenza di mosse (rimozioni di coppie di carte consecutive con somma dispari) tale per cui dopo di esse nessuna altra mossa è possibile (il gioco e finito) e la carta suddetta è ancora sul tavolo. Dati di input Il file input.txt è composto da 2 righe, contenenti: Riga 1: l unico intero N. Riga 2: gli N interi C i separati da spazio, nell ordine in cui sono disposti sul tavolo. Dati di output Il file output.txt deve essere composto da due righe, contenenti: Riga 1: il numero di diverse carte K che potrebbero rimanere sul tavolo a fine partita. Riga 2: i K interi che identificano le carte che potrebbero rimanere sul tavolo a fine partita. Assunzioni 1 N 100. N è sempre un numero dispari. 0 C i N 1 per ogni i = 0... N 1. Ogni numero tra 0 e N 1 compare esattamente una volta nella sequenza dei C i. 1 Seguendo un elaborato ordine di gioco che non rientra nei margini di questo problema. scommessa Pagina 8 di 10

scommessa IT Esempi di input/output input.txt output.txt 3 1 2 0 11 1 0 2 6 4 5 3 9 8 10 7 1 0 2 2 8 Spiegazione Nel primo caso di esempio, l unica mossa possibile è eliminare le carte 1 e 2 per cui rimane sul tavolo necessariamente la carta 0. Nel secondo caso di esempio sono invece possibili diverse sequenze di mosse. Una delle sequenze che lasciano la carta 2 è la seguente: 1 0 2 6 4 5 3 9 8 10 7 1 0 2 6 3 9 8 10 7 2 6 3 9 8 10 7 2 9 8 10 7 2 9 8 2 Una delle sequenze di mosse che lasciano la carta 8 è la seguente: 1 0 2 6 4 5 3 9 8 10 7 2 6 4 5 3 9 8 10 7 2 6 3 9 8 10 7 2 6 3 9 8 2 9 8 8 Non esistono invece sequenze di mosse che lasciano alcuna delle altre carte. scommessa Pagina 9 di 10

scommessa IT Soluzione 1 #include <iostream> 2 #include <fstream> 3 #include <vector> 4 5 using namespace std; 6 7 const int MAX_N = 150; 8 9 int nums[max_n]; 10 int parity[max_n]; 11 // unibili finendo ad i-1 se prefix[i] == 0 12 int prefix[max_n]; 13 // unibili partendo da i+1 se suffix[i] == 0 14 int suffix[max_n]; 15 16 int main() { 17 ifstream in("input.txt"); 18 ofstream out("output.txt"); 19 int N; 20 in >> N; 21 22 for (int i = 0; i < N; i++) { 23 in >> nums[i]; 24 parity[i] = (nums[i] % 2 == 0)? 1 : -1; 25 } 26 27 for (int i = 0; i < N-1; i++) 28 prefix[i+1] = prefix[i]+parity[i]; 29 for (int i = N-1; i >= 1; i--) 30 suffix[i-1] = suffix[i]+parity[i]; 31 32 vector<int> sol; 33 for (int i = 0; i < N; i++) 34 if (prefix[i] == 0 && suffix[i] == 0) 35 sol.push_back(nums[i]); 36 37 out << sol.size() << endl; 38 for (int n : sol) 39 out << n << ' '; 40 out << endl; 41 } scommessa Pagina 10 di 10