人工的過ぎる設定であまり自然じゃない問題だけど、整数の整除についての注意点を学べる教育的良問ですね。
問題概要
整数 が与えられる。 を 回二乗した数より大きい最小の素数を とする。
を で割ったあまりを求めよ。
制約
- < 1000
考えたこと
- のとき
- のとき
- のとき
- のとき
- ...
である。11111...1 (1 が 個) といったレピュニット数は、
と考えることで扱いやすくなる。こういう式になると、 と が互いに素なときに (mod. p) が成立するという Fermat の小定理が使えそうである。すなわち、 が の倍数になるから答えは 0 になりそうである。ただし 2 つ注意点があり
- 10 と が互いに素かどうか
- 9 で割るときに、9 と が互いに素かどうか (互いに素なら
であれば、両方満たすので答えは 0 でよい。 のときはちゃんと計算する。
#include <iostream> using namespace std; int main() { int n; cin >> n; if (n == 0) cout << 1 << endl; else if (n == 1) cout << 2 << endl; else if (n == 2) cout << 1 << endl; else cout << 0 << endl; }