Advertisement
cosenza987

Untitled

Jul 26th, 2023
782
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. //Слава Україні, Героям слава
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. ll addmod(ll a, ll b, ll m){
  10.     if(a >= m - b) return a + b - m;
  11.     return a + b;
  12. }
  13.  
  14. ll mulmod(ll a, ll b, ll m){
  15.     ll ans = 0;
  16.     while(b){
  17.         if(b & 1) ans = addmod(ans, a, m);
  18.         a = addmod(a, a, m);
  19.         b >>= 1;
  20.     }
  21.     return ans;
  22. }
  23.  
  24. ll fexp(ll a, ll b, ll n){
  25.     ll r = 1;
  26.     while(b){
  27.         if(b & 1) r = mulmod(r, a, n);
  28.         a = mulmod(a, a, n);
  29.         b >>= 1;
  30.     }
  31.     return r;
  32. }
  33.  
  34. bool miller(ll a, ll n){
  35.     if (a >= n) return true;
  36.     ll s = 0, d = n - 1;
  37.     while(d % 2 == 0 && d) d >>= 1, s++;
  38.     ll x = fexp(a, d, n);
  39.     if (x == 1 || x == n - 1) return true;
  40.     for (int r = 0; r < s; r++, x = mulmod(x,x,n)){
  41.         if (x == 1) return false;
  42.         if (x == n - 1) return true;
  43.     }
  44.     return 0;
  45. }
  46.  
  47. bool isprime(ll n){
  48.     if(n == 1) return false;
  49.     int base[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
  50.     for (int i = 0; i < 12; ++i) if (!miller(base[i], n)) return false;
  51.     return true;
  52. }
  53.  
  54. ll pollard(ll n){
  55.     ll x, y, d, c = 1;
  56.     if (n % 2 == 0) return 2;
  57.     while(true){
  58.         y = x = 2;
  59.         while(true){
  60.             x = addmod(mulmod(x,x,n), c, n);
  61.             y = addmod(mulmod(y,y,n), c, n);
  62.             y = addmod(mulmod(y,y,n), c, n);
  63.             d = __gcd(abs(x-y), n);
  64.             if (d == n) break;
  65.             else if (d > 1) return d;
  66.         }
  67.         c++;
  68.     }
  69. }
  70.  
  71. void factor(ll n, vector<ll>& v){
  72.     if (n == 1 || isprime(n)) return v.push_back(n);
  73.     ll f = pollard(n);
  74.     factor(f, v), factor(n/f, v);
  75.     sort(v.begin(), v.end());
  76. }
  77.  
  78. int main() {
  79.     ios_base::sync_with_stdio(false);
  80.     cin.tie(nullptr);
  81.     unordered_map<long long, long long> mp;
  82.     function<void(ll, ll, ll, ll, vector<ll>&, map<ll, ll>&)> calc = [&](ll a, ll b, ll c, ll val, vector<ll> &v, map<ll, ll> &m) {
  83.         if(!mp[c]) {
  84.             mp[c] = val;
  85.         } else {
  86.             mp[c] = min(mp[c], val);
  87.         }
  88.         assert(b < v.size());
  89.         if(a < m[v[b]]) {
  90.             calc(a + 1, b, c * v[b], val, v, m);
  91.         }
  92.         for(int i = b + 1; i < (int)v.size(); i++) {
  93.             calc(0, i, c, val, v, m);
  94.         }
  95.     };
  96.     for(int i = 1; i < (1 << 12); i++) {
  97.         long long cur = 0;
  98.         for(int j = 0; j < 12; j++) {
  99.             cur *= 10;
  100.             cur += ((i >> j) & 1);
  101.         }
  102.         vector<ll> v;
  103.         factor(cur, v);
  104.         map<ll, ll> tmp;
  105.         for(auto e : v) {
  106.             tmp[e]++;
  107.         }
  108.         v.erase(unique(v.begin(), v.end()), v.end());
  109.         calc(0, 0, 1, cur, v, tmp);
  110.     }
  111.     long long n;
  112.     while(cin >> n) {
  113.         cout << (mp.find(n) == mp.end() ? -1 : mp[n]) << "\n";
  114.     }
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement