結果
問題 | No.3028 No.9999 |
ユーザー |
![]() |
提出日時 | 2025-02-21 21:36:55 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 4,000 ms |
コード長 | 2,951 bytes |
コンパイル時間 | 2,393 ms |
コンパイル使用メモリ | 206,108 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2025-02-21 21:36:59 |
合計ジャッジ時間 | 3,297 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
//#pragma GCC target("avx2") //#pragma GCC optimize("O3") //#pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int,int>; using pll = pair<ll,ll>; using pli = pair<ll,int>; #define TEST cerr << "TEST" << endl #define AMARI 998244353 //#define AMARI 1000000007 #define el '\n' #define El '\n' #define YESNO(x) ((x) ? "Yes" : "No") #define VEC_UNIQ(v) sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); #define REV_PRIORITY_QUEUE(tp) priority_queue<tp,vector<tp>,greater<tp>> //数 N のトーシェント関数を求める。 //O(sqrt(N)) ただしメモ化をしているため、同じ数が何回も呼ばれる場合は O(log(この関数に出てきた種類数)) になる //メモ化の log が邪魔な場合は、static map<ll,ll> mp; 周りを消せばよい ll ococo_totient(ll n){ static map<ll,ll> mp; if(n == 1)return 1LL; if(mp.find(n) != mp.end())return mp[n]; ll ans = 1; for(ll i = 2LL; i * i <= n; i++){ bool first = true; while(n % i == 0){ n /= i; if(first)ans *= (i - 1); else ans *= i; first = false; } } if(n != 1)ans *= (n - 1); return mp[n] = ans; } ll beki(ll a,ll b,ll md){ ll ans = 1,temp = a % md; while(b){ if(b % 2){ ans *= temp; ans %= md; } temp *= temp; temp %= md; b /= 2; } return ans; } #define MULTI_TEST_CASE false void solve(void){ //問題を見たらまず「この問題設定から言えること」をいっぱい言う //一個回答に繋がりそうな解法が見えても、実装や細かい詰めに時間がかかりそうなら別の方針を考えてみる //添え字回りで面倒になりそうなときは楽になる言い換えを実装の前にじっくり考える //ある程度考察しても全然取っ掛かりが見えないときは実験をしてみる //よりシンプルな問題に言い換えられたら、言い換えた先の問題を自然言語ではっきりと書く //g++ -D_GLIBCXX_DEBUG -O2 b.cpp -o o ll n; cin >> n; if(n == 1){ cout << 1 << el; return; } ll temp = ococo_totient(n); vector<ll> divisior; for(ll i = 1; i * i <= temp; i++){ if(temp % i == 0){ divisior.push_back(i); divisior.push_back(temp / i); } } sort(divisior.begin(),divisior.end()); for(int i = 0; i < (int)divisior.size(); i++){ if(beki(10,divisior[i],n) == 1){ cout << divisior[i] << el; return; } } assert(0); return; } void calc(void){ return; } signed main(void){ cin.tie(nullptr); ios::sync_with_stdio(false); calc(); int t = 1; if(MULTI_TEST_CASE)cin >> t; while(t--){ solve(); } return 0; }