Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int n, P;
- long long a;
- bool find(long long num) {
- if(num < P) return false;
- if(num == P || num == P + 1) return true;
- if(num % P != 0 && (num - 1) % P != 0) return false;
- return num % P == 0 ? find(num / P) : find((num - 1) / P);
- }
- int solve(long long num, int rem) {
- if(num < P) return 0;
- if(num == P && rem == 0) return 0;
- if(num == P && rem == 1) return 0;
- if(num == P + 1 && rem == 0) return 1;
- if(num == P + 1 && rem == 1) return 1;
- if(num == P + 2 && rem == 1) return 1;
- if(num == 2 * P + 1 && rem == 0) return 1;
- if(num == 2 * P + 1 && rem == 1) return 1;
- if(num == 2 * P && rem == 1) return 1;
- if(num == 2 * P + 2 && rem == 1) return 1;
- if(rem > 2) return 0;
- if((num - 1) % P == 0) {
- long long pp = (num - 1) / P;
- long long c = pp / 2;
- if(find(c) && ((c * P + c * P + 1 == num) || (((c + 1) * P + (c + 1) * P + 1) == num))) return 1;
- }
- if(num % P == 0) return find(num - 1) + solve(num / P, 0);
- if((num - 2) % P == 0) return find(num - 1) + solve((num - 2) / P, 0);
- if((num - 1) % P == 0) return find(num - 1) + 2 * solve((num - 1) / P, 1);
- return 0;
- }
- int main() {
- scanf("%d %d", &n, &P);
- string ret = "";
- for(int i = 1; i <= n; ++i) {
- scanf("%lld", &a);
- int w = 0;
- if(a % 2 == 1 && find(a / 2) && find(a / 2 + 1)) w = 1;
- else w = solve(a, 0);
- if(w == 1) ret.push_back('1');
- else ret.push_back('0');
- }
- cout << ret << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement