結果
問題 | No.1339 循環小数 |
ユーザー |
![]() |
提出日時 | 2021-01-15 22:19:46 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 42 ms / 2,000 ms |
コード長 | 4,141 bytes |
コンパイル時間 | 2,027 ms |
コンパイル使用メモリ | 200,180 KB |
最終ジャッジ日時 | 2025-01-17 19:38:58 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 36 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define rep(i,n) for(int i = 0; i < (n); ++i)#define rrep(i,n) for(int i = (n)-1; i >= 0; --i)template<class T> void chmax(T& a, const T& b) {a = max(a, b);}template<class T> void chmin(T& a, const T& b) {a = min(a, b);}#define all(x) (x).begin(), (x).end()#define rall(x) (x).rbegin(), (x).rend()using ll = long long;using P = pair<int,int>;using VI = vector<int>;using VVI = vector<VI>;using VL = vector<ll>;using VVL = vector<VL>;std::pair<std::vector<int>,std::vector<int>> primes_sieve(const int n) {std::pair<std::vector<int>,std::vector<int>> rv;std::vector<int>& primes = rv.first;std::vector<int>& sieve = rv.second;primes.reserve(n / 10);sieve.resize(n + 1, 0);if (n >= 1) sieve[0] = sieve[1] = -1;else if (n >= 0) sieve[0] = -1;if (n <= 4) {for(int i = 2; i <= n; ++i) {if (sieve[i] == 0) {primes.push_back(i);sieve[i] = i;}if (i == 2 && n == 4) sieve[4] = 2;}return rv;}for(int i = 2; i <= n; i += 2) sieve[i] = 2;for(int i = 3; i <= n; i += 6) sieve[i] = 3;primes.push_back(2); primes.push_back(3);const int n3 = n / 3;int i = 5;for(; i <= n3; i += 4) {if (sieve[i] == 0) {sieve[i] = i;primes.push_back(i);int sz = primes.size();for(int j = 2;j < sz; ++j) {int p = primes[j];int x = i * p;if (x > n) break;sieve[x] = p;}} else {int si = sieve[i];for(int j = 2;; ++j) {int p = primes[j];int x = i * p;if (x > n) break;sieve[x] = p;if (p == si) break;}}i += 2;if (sieve[i] == 0) {sieve[i] = i;primes.push_back(i);int sz = primes.size();for(int j = 2;j < sz; ++j) {int p = primes[j];int x = i * p;if (x > n) break;sieve[x] = p;}} else {int si = sieve[i];for(int j = 2;; ++j) {int p = primes[j];int x = i * p;if (x > n) break;sieve[x] = p;if (p == si) break;}}}const int n2 = n - 2;for(; i <= n2; i += 4) {if (sieve[i] == 0) {sieve[i] = i;primes.push_back(i);}i += 2;if (sieve[i] == 0) {sieve[i] = i;primes.push_back(i);}}if (i <= n) {if (sieve[i] == 0) {sieve[i] = i;primes.push_back(i);}}return rv;}auto [primes, sieve] = primes_sieve(100000);int main() {ios::sync_with_stdio(false);cin.tie(0);int tt;cin >> tt;while(tt--) {int n;cin >> n;while(n % 2 == 0) n /= 2;while(n % 5 == 0) n /= 5;if (n == 1) {cout << 1 << '\n';continue;}int n0 = n;ll e = n;vector<pair<int, int>> fs;for(auto p: primes) {if (p * p > n) break;int cnt = 0;while(n % p == 0) n /= p, cnt++;if (cnt) e = e * (p - 1) / p;}if (n != 1) e = e * (n - 1) / n;int k = e;auto pow10 = [n0](int x) {ll now = 1;ll t = 10;while(x) {if (x & 1) {now *= t;now %= n0;}x >>= 1;t = t * t;t %= n0;}return now;};for(int i = 1; i * i <= e; ++i) {if (e % i == 0) {if (pow10(i) == 1) chmin<int>(k, i);if (pow10(e / i) == 1) chmin<int>(k, e / i);}}cout << k << '\n';}}