Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Слава Україні, Героям слава
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- ll addmod(ll a, ll b, ll m){
- if(a >= m - b) return a + b - m;
- return a + b;
- }
- ll mulmod(ll a, ll b, ll m){
- ll ans = 0;
- while(b){
- if(b & 1) ans = addmod(ans, a, m);
- a = addmod(a, a, m);
- b >>= 1;
- }
- return ans;
- }
- ll fexp(ll a, ll b, ll n){
- ll r = 1;
- while(b){
- if(b & 1) r = mulmod(r, a, n);
- a = mulmod(a, a, n);
- b >>= 1;
- }
- return r;
- }
- bool miller(ll a, ll n){
- if (a >= n) return true;
- ll s = 0, d = n - 1;
- while(d % 2 == 0 && d) d >>= 1, s++;
- ll x = fexp(a, d, n);
- if (x == 1 || x == n - 1) return true;
- for (int r = 0; r < s; r++, x = mulmod(x,x,n)){
- if (x == 1) return false;
- if (x == n - 1) return true;
- }
- return 0;
- }
- bool isprime(ll n){
- if(n == 1) return false;
- int base[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
- for (int i = 0; i < 12; ++i) if (!miller(base[i], n)) return false;
- return true;
- }
- ll pollard(ll n){
- ll x, y, d, c = 1;
- if (n % 2 == 0) return 2;
- while(true){
- y = x = 2;
- while(true){
- x = addmod(mulmod(x,x,n), c, n);
- y = addmod(mulmod(y,y,n), c, n);
- y = addmod(mulmod(y,y,n), c, n);
- d = __gcd(abs(x-y), n);
- if (d == n) break;
- else if (d > 1) return d;
- }
- c++;
- }
- }
- void factor(ll n, vector<ll>& v){
- if (n == 1 || isprime(n)) return v.push_back(n);
- ll f = pollard(n);
- factor(f, v), factor(n/f, v);
- sort(v.begin(), v.end());
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- unordered_map<long long, long long> mp;
- 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) {
- if(!mp[c]) {
- mp[c] = val;
- } else {
- mp[c] = min(mp[c], val);
- }
- assert(b < v.size());
- if(a < m[v[b]]) {
- calc(a + 1, b, c * v[b], val, v, m);
- }
- for(int i = b + 1; i < (int)v.size(); i++) {
- calc(0, i, c, val, v, m);
- }
- };
- for(int i = 1; i < (1 << 12); i++) {
- long long cur = 0;
- for(int j = 0; j < 12; j++) {
- cur *= 10;
- cur += ((i >> j) & 1);
- }
- vector<ll> v;
- factor(cur, v);
- map<ll, ll> tmp;
- for(auto e : v) {
- tmp[e]++;
- }
- v.erase(unique(v.begin(), v.end()), v.end());
- calc(0, 0, 1, cur, v, tmp);
- }
- long long n;
- while(cin >> n) {
- cout << (mp.find(n) == mp.end() ? -1 : mp[n]) << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement