Advertisement
Gassa

SRM 684 Div1 Medium

Mar 8th, 2016
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <iostream>
  8. #include <map>
  9. #include <set>
  10. #include <sstream>
  11. #include <string>
  12. #include <utility>
  13. #include <vector>
  14.  
  15. using namespace std;
  16.  
  17. int const MOD = 1000000007;
  18.  
  19. class DivFree
  20. {
  21. public:
  22.     int dfcount (int n, int k)
  23.     {
  24.         map <vector <int>, int> v;
  25.         int types = 0;
  26.         int type [k + 1];
  27.         int c [k + 1];
  28.         memset (c, 0, sizeof (c));
  29.         for (int j = 1; j <= k; j++)
  30.         {
  31.             vector <int> sig;
  32.             int a = j;
  33.             for (int e = 2; e * e <= a; e++)
  34.             {
  35.                 if (a % e == 0)
  36.                 {
  37.                     int num = 0;
  38.                     do
  39.                     {
  40.                         num++;
  41.                         a /= e;
  42.                     }
  43.                     while (a % e == 0);
  44.                     sig.push_back (num);
  45.                 }
  46.             }
  47.             if (a > 1)
  48.             {
  49.                 sig.push_back (1);
  50.             }
  51.  
  52.             sort (sig.begin (), sig.end ());
  53.             if (v.find (sig) == v.end ())
  54.             {
  55.                 v[sig] = types;
  56.                 types++;
  57.             }
  58.             type[j] = v[sig];
  59.             c[type[j]]++;
  60.         }
  61.  
  62.         map <int, int> g [types];
  63.         bool w [types];
  64.         memset (w, 0, sizeof (w));
  65.         for (int j = 1; j <= k; j++)
  66.         {
  67.             int jt = type[j];
  68.             if (w[jt])
  69.             {
  70.                 continue;
  71.             }
  72.             w[jt] = true;
  73.             for (int p = 1; p < j; p++)
  74.             {
  75.                 if (j % p == 0)
  76.                 {
  77.                     g[jt][type[p]]++;
  78.                 }
  79.             }
  80.         }
  81.  
  82.         pair <int, int> h [types] [types];
  83.         int hLen [types];
  84.         memset (hLen, 0, sizeof (hLen));
  85.         for (int jt = 0; jt < types; jt++)
  86.         {
  87.             for (auto pc : g[jt])
  88.             {
  89.                 h[jt][hLen[jt]] = pc;
  90.                 hLen[jt]++;
  91.             }
  92.         }
  93.  
  94.         int64_t f [2] [k + 1];
  95.         int b = 0;
  96.         memset (f[b], 0, sizeof (f[b]));
  97.         for (int jt = 0; jt < types; jt++)
  98.         {
  99.             f[b][jt] = 1;
  100.         }
  101.  
  102.         for (int i = 1; i < n; i++)
  103.         {
  104.             b ^= 1;
  105.             memset (f[b], 0, sizeof (f[b]));
  106.             int64_t sum = 0;
  107.             for (int jt = 0; jt < types; jt++)
  108.             {
  109.                 sum += f[!b][jt] * c[jt];
  110.             }
  111.             sum %= MOD;
  112.  
  113.             for (int jt = 0; jt < types; jt++)
  114.             {
  115.                 f[b][jt] = sum;
  116.             }
  117.  
  118.             for (int jt = 0; jt < types; jt++)
  119.             {
  120.                 for (int r = 0; r < hLen[jt]; r++)
  121.                 {
  122.                     int pt = h[jt][r].first;
  123.                     int num = h[jt][r].second;
  124.                     f[b][jt] -= f[!b][pt] * num;
  125.                 }
  126.             }
  127.  
  128.             for (int jt = 0; jt < types; jt++)
  129.             {
  130.                 f[b][jt] %= MOD;
  131.                 if (f[b][jt] < 0)
  132.                 {
  133.                     f[b][jt] += MOD;
  134.                 }
  135.             }
  136.         }
  137.  
  138.         int res = 0;
  139.         for (int jt = 0; jt < types; jt++)
  140.         {
  141.             res = (res + f[b][jt] * 1LL * c[jt]) % MOD;
  142.         }
  143.         return res;
  144.     }
  145. };
  146.  
  147. <%:testing-code%>
  148. //Powered by [KawigiEdit] 2.0!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement