#include <iostream>
#include <vector> // for Fibonacci numbers, random access is required
#include <set> // for multiplications of Fibonacci numbers
using namespace std;
// function to calculate Fibonacci numbers in given range
void calculateFibonacciNumbers(vector<unsigned int>& numbersOfFibonacci, unsigned int maxValue) {
// set init values
// F0 equals 1 to not repeating it in list
unsigned int valueF0 = 1;
unsigned int valueF1 = 1;
// temporary value to hold F0 value in calculations
unsigned int tmpF = 0;
// insert first Fibonacci number
//numbersOfFibonacci.push_back(0);
// calculate Fibonacci number until it will be greater than max value
while (valueF1 < maxValue) {
numbersOfFibonacci.push_back(valueF1);
tmpF = valueF0;
valueF0 = valueF1;
valueF1 += tmpF;
}
}
// function to calculate multiplications of given Fibonacci numbers
void calculateMultiplicationsOfFibonacciNumbers(set<unsigned int>& multiplicationsOfFibonacciNumbers, vector<unsigned int>* numbersOfFibonacci) {
// auxiliary iterators to limit range of Fibonacci numbers
// for rows:
vector<unsigned int>::iterator rowMinValue = numbersOfFibonacci->begin();
vector<unsigned int>::iterator rowMaxValue = numbersOfFibonacci->end() - (unsigned int)(numbersOfFibonacci->size()/2);
vector<unsigned int>::iterator rowIndex;
// for columns:
vector<unsigned int>::iterator colMinValue = numbersOfFibonacci->begin();
vector<unsigned int>::iterator colMaxValue = numbersOfFibonacci->end();
vector<unsigned int>::iterator colIndex;
// calculate multiplications without duplications
// and values greater than max value of input vector
// input value 0 separately
multiplicationsOfFibonacciNumbers.insert(0);
for (rowIndex = rowMinValue; rowIndex != rowMaxValue; ++rowIndex) {
// chech if all numbers will calculate
if (colMinValue == colMaxValue) break;
for (colIndex = colMinValue; colIndex != colMaxValue; ++colIndex) {
multiplicationsOfFibonacciNumbers.insert( (*rowIndex) * (*colIndex) );
}
// change range of columns
colMinValue++;
colMaxValue--;
}
}
int main(int argc, char* argv[]) {
// get number of data
unsigned int numberOfData = 0;
cin >> numberOfData;
// read all data
// if input vector is greater than 1000 then
// calculate all multiplications of Fibonacci numbers
// in range 0 to 10^9 -> it is 946 combinations
// otherwise during reading input vector search
// for the greatest value and calculate multiplications
// in range 0 to this value
unsigned int* dataInVector = new unsigned int[numberOfData];
unsigned int greatestValue = 0;
if (numberOfData > 1000) {
for (unsigned int i = 0; i < numberOfData; ++i) {
cin >> dataInVector[i];
if (dataInVector[i] > greatestValue) {
greatestValue = dataInVector[i];
}
}
} else {
greatestValue = 1000000000; // 10^9
for (unsigned int i = 0; i < numberOfData; ++i) {
cin >> dataInVector[i];
}
}
// variables for Fibonacci numbers and them multiplications
vector<unsigned int> numbersOfFibonacci;
set<unsigned int> multiplicationsOfFibonacciNumbers;
// calculate those values
calculateFibonacciNumbers(numbersOfFibonacci, greatestValue);
calculateMultiplicationsOfFibonacciNumbers(multiplicationsOfFibonacciNumbers, &numbersOfFibonacci);
// check if input values are Fibonacci numbers
// and display proper information
for (unsigned int i = 0; i < numberOfData; ++i) {
if (multiplicationsOfFibonacciNumbers.find(dataInVector[i]) != multiplicationsOfFibonacciNumbers.end()) {
cout << "TAK" << endl;
} else {
cout << "NIE" << endl;
}
}
// clear used data
delete dataInVector;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #include <iostream> #include <vector> // for Fibonacci numbers, random access is required #include <set> // for multiplications of Fibonacci numbers using namespace std; // function to calculate Fibonacci numbers in given range void calculateFibonacciNumbers(vector<unsigned int>& numbersOfFibonacci, unsigned int maxValue) { // set init values // F0 equals 1 to not repeating it in list unsigned int valueF0 = 1; unsigned int valueF1 = 1; // temporary value to hold F0 value in calculations unsigned int tmpF = 0; // insert first Fibonacci number //numbersOfFibonacci.push_back(0); // calculate Fibonacci number until it will be greater than max value while (valueF1 < maxValue) { numbersOfFibonacci.push_back(valueF1); tmpF = valueF0; valueF0 = valueF1; valueF1 += tmpF; } } // function to calculate multiplications of given Fibonacci numbers void calculateMultiplicationsOfFibonacciNumbers(set<unsigned int>& multiplicationsOfFibonacciNumbers, vector<unsigned int>* numbersOfFibonacci) { // auxiliary iterators to limit range of Fibonacci numbers // for rows: vector<unsigned int>::iterator rowMinValue = numbersOfFibonacci->begin(); vector<unsigned int>::iterator rowMaxValue = numbersOfFibonacci->end() - (unsigned int)(numbersOfFibonacci->size()/2); vector<unsigned int>::iterator rowIndex; // for columns: vector<unsigned int>::iterator colMinValue = numbersOfFibonacci->begin(); vector<unsigned int>::iterator colMaxValue = numbersOfFibonacci->end(); vector<unsigned int>::iterator colIndex; // calculate multiplications without duplications // and values greater than max value of input vector // input value 0 separately multiplicationsOfFibonacciNumbers.insert(0); for (rowIndex = rowMinValue; rowIndex != rowMaxValue; ++rowIndex) { // chech if all numbers will calculate if (colMinValue == colMaxValue) break; for (colIndex = colMinValue; colIndex != colMaxValue; ++colIndex) { multiplicationsOfFibonacciNumbers.insert( (*rowIndex) * (*colIndex) ); } // change range of columns colMinValue++; colMaxValue--; } } int main(int argc, char* argv[]) { // get number of data unsigned int numberOfData = 0; cin >> numberOfData; // read all data // if input vector is greater than 1000 then // calculate all multiplications of Fibonacci numbers // in range 0 to 10^9 -> it is 946 combinations // otherwise during reading input vector search // for the greatest value and calculate multiplications // in range 0 to this value unsigned int* dataInVector = new unsigned int[numberOfData]; unsigned int greatestValue = 0; if (numberOfData > 1000) { for (unsigned int i = 0; i < numberOfData; ++i) { cin >> dataInVector[i]; if (dataInVector[i] > greatestValue) { greatestValue = dataInVector[i]; } } } else { greatestValue = 1000000000; // 10^9 for (unsigned int i = 0; i < numberOfData; ++i) { cin >> dataInVector[i]; } } // variables for Fibonacci numbers and them multiplications vector<unsigned int> numbersOfFibonacci; set<unsigned int> multiplicationsOfFibonacciNumbers; // calculate those values calculateFibonacciNumbers(numbersOfFibonacci, greatestValue); calculateMultiplicationsOfFibonacciNumbers(multiplicationsOfFibonacciNumbers, &numbersOfFibonacci); // check if input values are Fibonacci numbers // and display proper information for (unsigned int i = 0; i < numberOfData; ++i) { if (multiplicationsOfFibonacciNumbers.find(dataInVector[i]) != multiplicationsOfFibonacciNumbers.end()) { cout << "TAK" << endl; } else { cout << "NIE" << endl; } } // clear used data delete dataInVector; return 0; } |
English