Advertisement
Kaidul

uva - 10139

Dec 28th, 2012
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.84 KB | None | 0 0
  1. #include <algorithm>
  2. #include <bitset>
  3. #include <cctype>
  4. #include <cmath>
  5. #include <complex>
  6. #include <cstdio>
  7. #include <cstdlib>
  8. #include <cstring>
  9. #include <ctime>
  10. #include <deque>
  11. #include <fstream>
  12. #include <iostream>
  13. #include <list>
  14. #include <climits>
  15. #include <map>
  16. #include <memory>
  17. #include <queue>
  18. #include <set>
  19. #include <sstream>
  20. #include <stack>
  21. #include <string>
  22. #include <utility>
  23. #include <vector>
  24. #include <iomanip>
  25.  
  26. using namespace std;
  27.  
  28. #define REP(i,n) for(__typeof(n) i=0; i<(n); i++)
  29. #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
  30. #define RFOR(i,a,b) for(__typeof(b) i=(a); i>(b); i--)
  31. #define RESET(t,value) memset((t), value, sizeof(t))
  32. typedef long long int64;
  33. typedef unsigned long long ui64;
  34. typedef long double d64;
  35. #define READ(f) freopen(f, "r", stdin)
  36. #define WRITE(f) freopen(f, "w", stdout)
  37. #define PI acos(-1.0)
  38. #define INF (1<<30)
  39. #define eps 1e-8
  40. #define pb push_back
  41. #define ppb pop_back
  42. #define pii pair<double,double>
  43. #define G struct node
  44.  
  45. template< class T > T gcd(T a, T b) { return (b != 0 ? gcd<T>(b, a%b) : a); }
  46. template< class T > T lcm(T a, T b) { return (a / gcd<T>(a, b) * b); }
  47. template< class T > void setmax(T &a, T b) { if(a < b) a = b; }
  48. template< class T > void setmin(T &a, T b) { if(b < a) a = b; }
  49.  
  50. vector < int > pset;
  51. void initSet(int _size){ pset.resize(_size); FOR(i,0,_size-1) pset[i]=i;}
  52. int findSet(int i){return (pset[i]== i)?i: (pset[i] = findSet(pset[i]));}
  53. void unionSet(int i,int j){ pset[findSet(i)]=findSet(j);}
  54. bool isSameSet(int i,int j){ return findSet(i)==findSet(j);}
  55.  
  56. #define Set(a, s) memset(a, s, sizeof (a))
  57. #define N 50000
  58.  
  59. bool mark [N];
  60. vector <int> primeList;
  61.  
  62. void sieve ()
  63. {
  64.     Set (mark, true);
  65.     mark [0] = mark [1] = false;
  66.  
  67.     for ( int i = 4; i < N; i += 2 )
  68.         mark [i] = false;
  69.  
  70.     for ( int i = 3; i * i <= N; i += 2 )
  71.         if ( mark [i] )
  72.            for ( int j = i * i; j < N; j += 2 * i )
  73.                mark [j] = false;
  74.  
  75.     primeList.push_back (2);
  76.  
  77.     for ( int i = 3; i < N; i += 2 )
  78.          if ( mark [i] )
  79.             primeList.push_back (i);
  80. }
  81.  
  82.  
  83. int get_powers(int n, int p)
  84. {
  85.     int res = 0;
  86.     for (int power = p ; power <= n ; power *= p)
  87.         res += n/power;
  88.     return res;
  89. }
  90.  
  91. int main()
  92. {
  93.     sieve(); // pow(2,31) - 1
  94.     int n,m;
  95.     int save, count, prime;
  96.     bool flag;
  97.     queue < pair<int, int> > primeFact;
  98.     while(cin>>n>>m) {
  99.         /*
  100.         ui64 fact = 1;
  101.         FOR(i, 2, n) {
  102.             fact *= (i % m);
  103.         }
  104.         fact %= m;
  105.         if(!fact) cout<<m<<" divides "<<n<<"!\n";
  106.         else cout<<m<<" does not divide "<<n<<"!\n";
  107.         */
  108.  
  109.         if(!m) {
  110.             cout<<m<<" does not divide "<<n<<"!\n";
  111.             continue;
  112.         }
  113.  
  114.         if ( n >= m ) {
  115.             cout<<m<<" divides "<<n<<"!\n";
  116.             continue;
  117.         }
  118.  
  119.  
  120.         save = m;
  121.         flag = true;
  122.         //primeFact = queue < pair<int, int> > ();
  123.  
  124.  
  125.  
  126.         REP(i, primeList.size()) {
  127.             prime = primeList[i];
  128.             if(prime > save) break;
  129.             count = 0;
  130.             while( !(m % prime) ) {
  131.                 count++;
  132.                 m /= prime;
  133.             }
  134.             if(count) {
  135.                if( get_powers(n, prime) < count ) {
  136.                    flag = false;
  137.                    break;
  138.                }
  139.             }
  140.             //primeFact.push(make_pair(i, count));
  141.         }
  142.         if( m > 50000 &&  get_powers(n, m) < 1 ) {
  143.           flag = false;
  144.         }
  145.  
  146.         /*
  147.         while(!primeFact.empty()) {
  148.             pair<int, int> p = primeFact.front();
  149.             if( get_powers(n, p.first) >= p.second ) flag = true;
  150.             else flag = false;
  151.             primeFact.pop();
  152.         }
  153.         */
  154.         if(flag) cout<<save<<" divides "<<n<<"!\n";
  155.         else cout<<save<<" does not divide "<<n<<"!\n";
  156.     }
  157.     return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement