Tuesday, January 15, 2019

[UVa] 11099 - Next Same-Factored

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 11099 - Next Same-Factored
Source            : UVA Online Judge
Category          : Number Theory, Prime Factorization
Algorithm         : Number Theory
Verdict           : Accepted

  1. #include"bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll            long long int  
  6.   
  7. static const int maxn = 1e6 + 6;  
  8.   
  9. bool isPrime[maxn];  
  10. vector <int> prime;  
  11.   
  12. inline void seive()  
  13. {  
  14.       fill(begin(isPrime), end(isPrime), true);  
  15.       isPrime[0] = isPrime[1] = false;  
  16.       for (int i = 4; i < maxn; i += 2) isPrime[i] = false;  
  17.       for (int i = 3; i*i <= maxn; i += 2)  
  18.       {  
  19.             if (isPrime[i])  
  20.             {  
  21.                   for (int j = i*i; j < maxn; j += i+i) isPrime[j] = false;  
  22.             }  
  23.       }  
  24.       prime.emplace_back(2);  
  25.       for (int i = 3; i < maxn; i += 2)  
  26.       {  
  27.             if (isPrime[i]) prime.emplace_back(i);  
  28.       }  
  29. }  
  30.   
  31. vector <int> factor;  
  32.   
  33. inline void primeFactorization(ll n)  
  34. {  
  35.       for (int p : prime)  
  36.       {  
  37.             if (p*p > n) break;  
  38.             if (n % p) continue;  
  39.             factor.emplace_back(p);  
  40.             while (n % p == 0) n /= p;  
  41.       }  
  42.       if (n > 1) factor.emplace_back(n);  
  43. }  
  44.   
  45. ll n, next_n, len;  
  46. bool found;  
  47.   
  48. inline void solve(int pos, ll num)  
  49. {  
  50.       if (num > n && num < next_n)  
  51.       {  
  52.             found = true;  
  53.             next_n = num;  
  54.             return;  
  55.       }  
  56.       if (pos >= len || num > 2000000 || num > next_n) return;  
  57.       solve(pos, num * factor[pos]);  
  58.       solve(pos+1, num * factor[pos]);  
  59.       solve(pos+1, num);  
  60. }  
  61.   
  62. int main()  
  63. {  
  64.       seive();  
  65.       while (cin >> n)  
  66.       {  
  67.             if (n == 1)  
  68.             {  
  69.                   cout << "Not Exist!" << endl;  
  70.                   continue;  
  71.             }  
  72.             factor.clear();  
  73.             primeFactorization(n);  
  74.             ll num = 1;  
  75.             for (int p : factor) num *= p;  
  76.             next_n = 2000000 - 1;  
  77.             found = false;  
  78.             len = factor.size();  
  79.             solve(0, num);  
  80.             if (found) cout << next_n << endl;  
  81.             else cout << "Not Exist!" << endl;  
  82.       }  
  83. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.