Эффект: $ в $ 101 вес, вес $ ш ^ 0, ш ^ 1, ..., ж ^ 100 $, можно найти весила $ м $.
ш <= 3, когда по-видимому, можно назвать весь вес, в противном случае вы можете двухсторонний поиск насилие.
#include <iostream> #include <sstream> #include <алгоритм> #include <cstdio> #include <math.h> #include <набор> #include <карта> #include <unordered_map> #include <очереди> #include < строка> #include <string.h> #include <BitSet> #define РЭП (я, а, п) для (INT I = а, я <= п; ++ я) #define ПЕР (я, а, п) для (INT I = п; I> = а; - я) #define ч putchar (10) #define пб push_back #define LC (O << 1) #define гс (ЖХ | 1) #define середины ((л + г) >> 1) #define Ls LC, л, средний #define RS гс, середина + 1,г #define х первый #define у второго #define -го станда :: IOS :: sync_with_stdio (ложь) #define Endl '\ N' #define БД (а) ({REP (__ я, 1, п) соиЬ << а [__ я] <<»«; ч;}) с использованием пространства имен станд; ЬурейеЕ долго долго LL; ЬурейиЙ пар <Int, Int> PII; Const INT Р = 1e9 + 7, Р2 = 998244353, INF = 0x3f3f3f3f; LL НОД (LL а, Л.Л. б) {возвращение Ь НОД (Ь, а% б): а;} LL qpow (LL а, Л.Л. п) {LL г = 1% Р, ибо (в% = Р; п ; а = а * а% Р, п >> = 1) , если (п & 1) г = г * а% Р; возвращение г;} LL INV (LL х) {вернуться х <= 1 1: INV (Р% х) * (ПП / х)% р;} инлайн INT - й () {INT х = 0; р = символ GetChar (), в то время (р < '0' || р> '9') р = GetChar () , тогда как (р> = '0' && р <= '9') х = х * 10 + р-'0' , р = GetChar (); возвращение х;} // головка Int W, м; LL [100]; unordered_map <LL, Int> F [2]; недействительными ДФС (Int, Int д х, еще { ДФС (д + 1, х, Num + а [г], е); ДФС (д + 1, х, Num-а [d], е); } } INT основных () { зсапЕ ( "% d% d", & ш, & м); если (ш <= 3) возвращает (путы "ДА"), 0; Теперь LL = 1; REP (я, 0.16) { а [++ * а] = Теперь; Теперь * = ш; } ДФС (1, * а / 2,0, F [0]); ДФС (* а / 2 + 1, * а, 0, е [1]); для (авто && т: F [0]) { если (е [1] .Count (t.x + M)) возвращают пут ( "ДА"), 0; } Ставит ( "НЕТ"); }
Есть на самом деле лучший подход.
#include <iostream> #include <sstream> #include <алгоритм> #include <cstdio> #include <math.h> #include <набор> #include <карта> #include <unordered_map> #include <очереди> #include < строка> #include <string.h> #include <BitSet> #define РЭП (я, а, п) для (INT I = а, я <= п; ++ я) #define ПЕР (я, а, п) для (INT I = п; I> = а; - я) #define ч putchar (10) #define пб push_back #define LC (O << 1) #define гс (ЖХ | 1) #define середины ((л + г) >> 1) #define Ls LC, л, средний #define RS гс, середина + 1,г #define х первый #define у второго #define -го станда :: IOS :: sync_with_stdio (ложь) #define Endl '\ N' #define БД (а) ({REP (__ я, 1, п) соиЬ << а [__ я] <<»«; ч;}) с использованием пространства имен станд; ЬурейеЕ долго долго LL; ЬурейиЙ пар <Int, Int> PII; Const INT Р = 1e9 + 7, Р2 = 998244353, INF = 0x3f3f3f3f; LL НОД (LL а, Л.Л. б) {возвращение Ь НОД (Ь, а% б): а;} LL qpow (LL а, Л.Л. п) {LL г = 1% Р, ибо (в% = Р; п ; а = а * а% Р, п >> = 1) , если (п & 1) г = г * а% Р; возвращение г;} LL INV (LL х) {вернуться х <= 1 1: INV (Р% х) * (ПП / х)% р;} инлайн INT - й () {INT х = 0; р = символ GetChar (), в то время (р < '0' || р> '9') р = GetChar () , тогда как (р> = '0' && р <= '9') х = х * 10 + р-'0' , р = GetChar (); возвращение х;} // головка INT основных () { Int W, м ; зсапЕ ( "% d% d", & ш, & м); в то время как (м) { если ((М-1)% вес == 0) --m; м / = ш; } иначе , если ((т + 1)% вес == 0) ++ м; остальное , если (м% ж) возвращают пут ( "НЕТ"), 0; ставит ( "ДА"); }