#include <iostream>
using namespace std;
// Function to check if it's possible for a prime factor to divide n! the required number of times
bool solve(int n, int p, int reqCount) {
long long pv = p;
// Iteratively calculate the sum of quotients n / (prime ^ i) until n / (prime ^ i) becomes zero or reqCount reaches zero
while (n / pv && reqCount > 0) {
reqCount -= n / pv;
pv *= p;
}
// If the reqCount becomes non-positive, return true, indicating that the prime factor can divide n!
return reqCount <= 0;
}
int main() {
int n, d, c, t;
bool isDiv;
// Reading input until end of file
while (cin >> n >> d) {
t = d;
isDiv = true;
// Iterate through all prime
for (int i = 2; i * i <= d && isDiv; ++i) {
c = 0;
// Count the number of times i divides d
while (d % i == 0) {
d /= i;
++c;
}
// If i divides d at least once, check if it's possible for i to divide n!
if (c > 0)
isDiv = solve(n, i, c);
}
// If d is still greater than 1 and isDiv is true, check if it's possible for d to divide n!
if (d > 1 && isDiv) {
isDiv = solve(n, d, 1);
}
// Print the result indicating whether d divides n! or not using if-else
if (isDiv) {
cout << t << " divides " << n << "!\n";
} else {
cout << t << " does not divide " << n << "!\n";
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEZ1bmN0aW9uIHRvIGNoZWNrIGlmIGl0J3MgcG9zc2libGUgZm9yIGEgcHJpbWUgZmFjdG9yIHRvIGRpdmlkZSBuISB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIHRpbWVzCmJvb2wgc29sdmUoaW50IG4sIGludCBwLCBpbnQgcmVxQ291bnQpIHsKICAgIGxvbmcgbG9uZyBwdiA9IHA7CiAgICAKICAgIC8vIEl0ZXJhdGl2ZWx5IGNhbGN1bGF0ZSB0aGUgc3VtIG9mIHF1b3RpZW50cyBuIC8gKHByaW1lIF4gaSkgdW50aWwgbiAvIChwcmltZSBeIGkpIGJlY29tZXMgemVybyBvciByZXFDb3VudCByZWFjaGVzIHplcm8KICAgIHdoaWxlIChuIC8gcHYgJiYgcmVxQ291bnQgPiAwKSB7CiAgICAgICAgcmVxQ291bnQgLT0gbiAvIHB2OwogICAgICAgIHB2ICo9IHA7CiAgICB9CiAgICAKICAgIC8vIElmIHRoZSByZXFDb3VudCBiZWNvbWVzIG5vbi1wb3NpdGl2ZSwgcmV0dXJuIHRydWUsIGluZGljYXRpbmcgdGhhdCB0aGUgcHJpbWUgZmFjdG9yIGNhbiBkaXZpZGUgbiEKICAgIHJldHVybiByZXFDb3VudCA8PSAwOwp9CgppbnQgbWFpbigpIHsKICAgIGludCBuLCBkLCBjLCB0OwogICAgYm9vbCBpc0RpdjsKICAgIAogICAgLy8gUmVhZGluZyBpbnB1dCB1bnRpbCBlbmQgb2YgZmlsZQogICAgd2hpbGUgKGNpbiA+PiBuID4+IGQpIHsKICAgICAgICB0ID0gZDsKICAgICAgICBpc0RpdiA9IHRydWU7CiAgICAgICAgCiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBwcmltZQogICAgICAgIGZvciAoaW50IGkgPSAyOyBpICogaSA8PSBkICYmIGlzRGl2OyArK2kpIHsKICAgICAgICAgICAgYyA9IDA7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGkgZGl2aWRlcyBkCiAgICAgICAgICAgIHdoaWxlIChkICUgaSA9PSAwKSB7CiAgICAgICAgICAgICAgICBkIC89IGk7CiAgICAgICAgICAgICAgICArK2M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIElmIGkgZGl2aWRlcyBkIGF0IGxlYXN0IG9uY2UsIGNoZWNrIGlmIGl0J3MgcG9zc2libGUgZm9yIGkgdG8gZGl2aWRlIG4hCiAgICAgICAgICAgIGlmIChjID4gMCkKICAgICAgICAgICAgICAgIGlzRGl2ID0gc29sdmUobiwgaSwgYyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIElmIGQgaXMgc3RpbGwgZ3JlYXRlciB0aGFuIDEgYW5kIGlzRGl2IGlzIHRydWUsIGNoZWNrIGlmIGl0J3MgcG9zc2libGUgZm9yIGQgdG8gZGl2aWRlIG4hCiAgICAgICAgaWYgKGQgPiAxICYmIGlzRGl2KSB7CiAgICAgICAgICAgIGlzRGl2ID0gc29sdmUobiwgZCwgMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIFByaW50IHRoZSByZXN1bHQgaW5kaWNhdGluZyB3aGV0aGVyIGQgZGl2aWRlcyBuISBvciBub3QgdXNpbmcgaWYtZWxzZQogICAgICAgIGlmIChpc0RpdikgewogICAgICAgICAgICBjb3V0IDw8IHQgPDwgIiBkaXZpZGVzICIgPDwgbiA8PCAiIVxuIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb3V0IDw8IHQgPDwgIiBkb2VzIG5vdCBkaXZpZGUgIiA8PCBuIDw8ICIhXG4iOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==