/* 2019-12 Jedrzej Pacanowski * PA2019 apb */ #include <iostream> #include <vector> typedef unsigned long long u64; /// ilosc mozliwych dodawan (cyfry) u64 sposoby(u64 num){ if(num < 10) return num+1; if(num < 20) return 19-num; else return 0; // ??? } u64 solve(const std::vector<unsigned char>& num, u64 idx=0) { u64 sz = num.size(); if(sz-idx == 0)return 1; if(sz-idx == 1)return sposoby(num[idx]); u64 result = sposoby(num[idx]) * solve(num,idx+1); if(sz-idx >=1 && num[idx+1] == 1) result += sposoby(10+num[idx]) * solve(num,idx+2); return result; } int main() { std::cin.tie(0); std::ios_base::sync_with_stdio(false); u64 liczba; // [1 ; 10**18) std::cin >> liczba; std::vector<unsigned char> num; num.reserve(20); u64 i = liczba; while(i>0){ unsigned char _cyfra = i % 10; i /= 10; num.push_back(_cyfra); } std::cout << solve(num) <<'\n'; 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 | /* 2019-12 Jedrzej Pacanowski * PA2019 apb */ #include <iostream> #include <vector> typedef unsigned long long u64; /// ilosc mozliwych dodawan (cyfry) u64 sposoby(u64 num){ if(num < 10) return num+1; if(num < 20) return 19-num; else return 0; // ??? } u64 solve(const std::vector<unsigned char>& num, u64 idx=0) { u64 sz = num.size(); if(sz-idx == 0)return 1; if(sz-idx == 1)return sposoby(num[idx]); u64 result = sposoby(num[idx]) * solve(num,idx+1); if(sz-idx >=1 && num[idx+1] == 1) result += sposoby(10+num[idx]) * solve(num,idx+2); return result; } int main() { std::cin.tie(0); std::ios_base::sync_with_stdio(false); u64 liczba; // [1 ; 10**18) std::cin >> liczba; std::vector<unsigned char> num; num.reserve(20); u64 i = liczba; while(i>0){ unsigned char _cyfra = i % 10; i /= 10; num.push_back(_cyfra); } std::cout << solve(num) <<'\n'; return 0; } |