Pagini recente » Cod sursa (job #1476996) | Cod sursa (job #1198491) | Cod sursa (job #466221) | Cod sursa (job #3176810) | Cod sursa (job #1592762)
//try #2
#include <fstream>
#include <string>
#include <iostream>
const int kMaxDigits = 10005;
//I AM NOT COMPLETLY SURE WHY IT WORKS
//FUCKING TRIAL AND ERROR
bool hasProperty(int *number, int left, int right)
{
bool ind = true; //ugly ass variable
while(right-left > 1) {
if(number[left] > 19) return false;
else if(number[left] == 19) {
if(number[right] == 8) number[left+1] +=10;
else return false;
number[right-1] -= 1;
}
else if(number[left] == 1 && ind && number[right] != 1) return false;
else if(number[left] <= 9) {
if(number[left] == number[right]+1) number[left+1] +=10;
else if(number[left] != number[right]) return false;
}
else if(number[left] == 10) {
if(number[right] == 9) number[left+1]+=10;
else if(number[right] == 0) {
number[right-1] -= 1;
}
else return false;
}
else {
if(number[left]%10 == number[right]+1) number[left+1]+=10;
else if(number[left]%10 != number[right]) return false;
number[right-1] -= 1;
}
ind = false;
int i;
for(i = right-1; number[i] < 0; --i) {
number[i] = 9;
--number[i-1];
}
if(i == left) return false;
++left;
--right;
}
if(left == right) {
if(number[left]%2) return false;
else return true;
}
else {
if(number[left] > 10) {
if(number[left]-11 == number[right]) return true;
else return false;
}
else if(number[left] <= 9){
if(number[left] == number[right]) return true;
else return false;
}
else return false;
}
return true;
}
bool brute_force(int number)
{
for(int i = 0; i <= number; ++i)
{
int aux = 0, x = i;
while(x) {
aux = aux*10 + x%10;
x/=10;
}
if(i+aux==number) return true;
}
return false;
}
int test_up_to(int limit)
{
int number1[kMaxDigits];
int number2[kMaxDigits];
for(int i = 0; i <= limit; ++i) {
bool testing = brute_force(i);
int x = i, n_digits = 0;
while(x) {
for(int j = n_digits; j >= 1; --j) {
number1[j] = number1[j-1];
number2[j] = number2[j-1];
}
number1[0] = x%10;
number2[0] = number1[0];
++n_digits;
x /= 10;
}
if(number2[0] == 1) number2[1] += 10;
if((hasProperty(number1, 0, n_digits-1) || (number2[0] == 1 && hasProperty(number2, 1, n_digits-1))) != testing) {
std::cout<<i<<' '<<testing<<'\n';
}
}
}
int main()
{
// test_up_to(100001);
std::ifstream in("invers.in");
std::ofstream out("invers.out");
std::string string_number;
int number[kMaxDigits];
int n;
in>>n;
for(int i = 0; i < n; ++i) {
bool has_property = false;
in>>string_number;
for(int j = 0; j < string_number.size(); ++j)
number[j] = static_cast<int>(string_number[j]-'0');
has_property = hasProperty(number, 0, string_number.size()-1);
if(string_number[0] == '1') {
for(int j = 0; j < string_number.size(); ++j)
number[j] = static_cast<int>(string_number[j]-'0');
number[1] += 10;
has_property = has_property || hasProperty(number, 1, string_number.size()-1);
}
if(has_property) out<<"DA\n";
else out<<"NU\n";
}
return 0;
}