Advertisement
Guest User

Untitled

a guest
Nov 6th, 2022
5,981
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int mod = 998244353;
  4. struct Mint
  5. {
  6.     int val;
  7.     Mint(int _val = 0)
  8.     {
  9.         val = _val % mod;
  10.     }
  11.     Mint(long long _val = 0)
  12.     {
  13.         val = _val % mod;
  14.     }
  15.     Mint operator+(Mint oth)
  16.     {
  17.         return val + oth.val;
  18.     }
  19.     Mint operator*(Mint oth)
  20.     {
  21.         return 1LL * val * oth.val;
  22.     }
  23.     Mint operator-(Mint oth)
  24.     {
  25.         return val - oth.val + mod;
  26.     }
  27.     void operator+=(Mint oth)
  28.     {
  29.         val = (Mint(val) + oth).val;
  30.     }
  31.     void operator-=(Mint oth)
  32.     {
  33.         val = (Mint(val) - oth).val;
  34.     }
  35.     void operator*=(Mint oth)
  36.     {
  37.         val = (Mint(val) * oth).val;
  38.     }
  39. };
  40. vector<int> get_primes(int n)
  41. {
  42.     int d = 2;
  43.     vector<int> ans;
  44.     while (d * d <= n)
  45.     {
  46.         bool este = false;
  47.         while (n % d == 0)
  48.         {
  49.             n /= d;
  50.             este = true;
  51.         }
  52.         if (este)
  53.         {
  54.             ans.push_back(d);
  55.         }
  56.         d++;
  57.     }
  58.     if (n != 1)
  59.     {
  60.         ans.push_back(n);
  61.     }
  62.     return ans;
  63. }
  64. int gcd(int a, int b)
  65. {
  66.     while (b)
  67.     {
  68.         int c = a % b;
  69.         a = b;
  70.         b = c;
  71.     }
  72.     return a;
  73. }
  74. int main()
  75. {
  76.     cin.tie(nullptr)->sync_with_stdio(false);
  77.     int q;
  78.     cin >> q;
  79.     while (q--)
  80.     {
  81.         int n, m;
  82.         cin >> n >> m;
  83.         vector<int> a(n + 1);
  84.         for (int i = 1; i <= n; ++i)
  85.         {
  86.             cin >> a[i];
  87.         }
  88.         bool ok = true;
  89.         for (int i = 2; i <= n; ++i)
  90.         {
  91.             if (a[i - 1] % a[i] != 0)
  92.             {
  93.                 ok = false;
  94.                 break;
  95.             }
  96.         }
  97.         if (!ok)
  98.         {
  99.             cout << 0 << '\n';
  100.             continue;
  101.         }
  102.         vector<int> factori = get_primes(a[1]);
  103.         map<pair<int, int>, int> calculat;
  104.         for (int i = 2; i <= n; ++i)
  105.         {
  106.             calculat[{a[i - 1], a[i]}] = 0;
  107.         }
  108.         for (auto i : calculat)
  109.         {
  110.             int left = i.first.first / i.first.second;
  111.             int till = m / i.first.second;
  112.             vector<int> left_primes;
  113.             for (auto i : factori)
  114.             {
  115.                 if (left % i == 0)
  116.                 {
  117.                     left_primes.push_back(i);
  118.                 }
  119.             }
  120.             int sz = (int)left_primes.size();
  121.             int ans = 0;
  122.             for (int mask = 0; mask < (1 << sz); ++mask)
  123.             {
  124.                 int prod = 1;
  125.                 int cnt = 0;
  126.                 for (int j = 0; j < sz; ++j)
  127.                 {
  128.                     if (mask & (1 << j))
  129.                     {
  130.                         prod *= left_primes[j];
  131.                         cnt++;
  132.                     }
  133.                 }
  134.                 if (cnt % 2 == 0)
  135.                 {
  136.                     ans += till / prod;
  137.                 }
  138.                 else
  139.                 {
  140.                     ans -= till / prod;
  141.                 }
  142.             }
  143.             calculat[i.first] = ans;
  144.         }
  145.         Mint ans = 1;
  146.         for (int i = 2; i <= n; ++i)
  147.         {
  148.             ans = ans * calculat[{a[i - 1], a[i]}];
  149.         }
  150.         cout << ans.val << '\n';
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement