Guest User

Untitled

a guest
Dec 13th, 2016
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1. #include <algorithm>
  2. #include <string>
  3. #include <vector>
  4. #include <queue>
  5. #include <iostream>
  6. #include <cmath>
  7. #include <sstream>
  8. #include <map>
  9. #include <set>
  10. #include <cstring>
  11. #include <unordered_map>
  12. using namespace std;
  13. #define pb push_back
  14. #define INF 1000000000
  15. #define L(s) (int)((s).size())
  16. #define FOR(i,a,b) for (int _n(b), i(a); i <= _n; i++)
  17. #define FORD(i,a,b) for(int i=(a),_b=(b);i>=_b;i--)
  18. #define rep(i,n) FOR(i,1,(n))
  19. #define rept(i,n) FOR(i,0,(n)-1)
  20. #define C(a) memset((a),0,sizeof(a))
  21. #define ll long long
  22. #define all(c) (c).begin(), (c).end()
  23. #define SORT(c) sort(all(c))
  24. #define VI vector<int>
  25. #define ppb pop_back
  26. #define mp make_pair
  27. #define pii pair<int,int>
  28. #define pdd pair<double,double>
  29. #define x first
  30. #define y second
  31. #define MOD 1000000007
  32.  
  33. int cur[102], nx[102];
  34. VI sm[102];
  35. int ls[102];
  36. unordered_map<unsigned ll, int> q;
  37. int n;
  38.  
  39. inline void doit(int cnt) {
  40.     rept(iter, cnt) {
  41.         memmove(cur, nx, n * sizeof(int));
  42.         q.clear();
  43.         int k = 0;
  44.         rept(i, n) {
  45.             int c = 0;
  46.             rept(j, L(sm[i])) {
  47.                 ls[c++] = cur[sm[i][j]];
  48.             }
  49.             sort(ls, ls + c);
  50.             unsigned ll h = 1 + L(sm[i]);
  51.             rept(j, c) {
  52.                 h = (h * 1234567891) ^ ls[j];
  53.             }
  54.             h = h * 1000000009 + cur[i];
  55.             auto it = q.find(h);
  56.             if (it != q.end()) {
  57.                 nx[i] = it->y;
  58.             }
  59.             else {
  60.                 q[h] = k++;
  61.                 nx[i] = k - 1;
  62.             }
  63.         }
  64.     }
  65. }
  66.  
  67. bool used[102];
  68. class AutomorphicGraph
  69. {
  70.     public:
  71.     int count( int n, vector <int> a, vector <int> b )
  72.     {
  73.         ::n = n;
  74.         rept(i, n) sm[i].clear();
  75.         rept(i, L(a)) {
  76.             sm[a[i]].pb(b[i]);
  77.             sm[b[i]].pb(a[i]);
  78.         }
  79.  
  80.         rept(i, n) nx[i] = L(sm[i]);
  81.         int ans = 1;
  82.         C(used);
  83.         doit(5000);
  84.         while (1) {
  85.             doit(600);
  86.             int mn = INF;
  87.             rept(i, n) {
  88.                 if (used[i]) continue;
  89.                 mn = min(mn, nx[i]);
  90.             }
  91.             if (mn >= INF) break;
  92.             int c = 0;
  93.             rept(i, n) {
  94.                 if (!used[i] && nx[i] == mn) {
  95.                     ++c;
  96.                 }
  97.             }
  98.             ans = (ll)ans * c % MOD;
  99.  
  100.             rept(i, n) {
  101.                 if (!used[i] && nx[i] == mn) {
  102.                     used[i] = 1;
  103.                     nx[i] = 101;
  104.                     break;
  105.                 }
  106.             }
  107.         }
  108.         return ans;
  109.     }
  110. };
Add Comment
Please, Sign In to add comment