willy108

colorful gensokyo

Nov 22nd, 2022
905
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. //misaka and elaina will carry me to master
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <utility>
  7. #include <cassert>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <functional>
  11. #include <ctime>
  12. #include <cstdlib>
  13. #include <numeric>
  14. #include <set>
  15. #include <array>
  16. #include <queue>
  17. #include <map>
  18. #include <chrono>
  19. #include <random>
  20.  
  21. #define ll long long
  22. #define lb long double
  23. #define sz(x) ((int)(x.size()))
  24. #define all(x) x.begin(), x.end()
  25. #define pb push_back
  26. #define mp make_pair
  27. #define kill(x, s) {if(x){ cout << s << "\n"; return ; }}
  28.  
  29. //#ifndef LOCAL
  30. #define cerr while(0) cerr
  31. //#endif
  32.  
  33. const lb eps = 1e-9;
  34. const ll mod = 1e9 + 7, ll_max = 1e18;
  35. //const ll mod = (1 << (23)) * 119 +1, ll_max = 1e18;
  36. const int MX = 50 +10, int_max = 0x3f3f3f3f;
  37.  
  38. struct {
  39.   template<class T>
  40.   operator T() {
  41.     T x; std::cin >> x; return x;
  42.   }
  43. } in;
  44.  
  45. using namespace std;
  46.  
  47. namespace kactl{
  48. #define rep(i, a, b) for(int i = a; i<b; i++)
  49.  
  50.     ll det(vector<vector<ll>>& a) {
  51.         int n = sz(a); ll ans = 1;
  52.         rep(i,0,n) {
  53.             rep(j,i+1,n) {
  54.                 while (a[j][i] != 0) { // gcd step
  55.                     ll t = a[i][i] / a[j][i];
  56.                     if (t) rep(k,i,n)
  57.                         a[i][k] = (a[i][k] - a[j][k] * t) % mod;
  58.                     swap(a[i], a[j]);
  59.                     ans *= -1;
  60.                 }
  61.             }
  62.             ans = ans * a[i][i] % mod;
  63.             if (!ans) return 0;
  64.         }
  65.         return (ans + mod) % mod;
  66.     }
  67.  
  68. }
  69.  
  70. ll binpow(ll a, ll b = mod -2){
  71.     ll ans = 1;
  72.     for(ll i = 1; i<=b; i*=2ll){
  73.         if(b&i) (ans *= a) %= mod;
  74.         (a *= a) %= mod;
  75.     }
  76.     return ans;
  77. }
  78.  
  79. int n;
  80.  
  81.  
  82. //coeff of x^0, x^1, x^n respectively
  83. array<int, 3> arr[MX][MX];
  84.  
  85. vector<ll> big;
  86.  
  87. ll f[MX*MX];
  88. ll g[MX*MX];
  89. ll oup[MX][MX];
  90.  
  91. ll F(ll x){
  92.     cerr << x << ": \n";
  93.     vector<vector<ll>> mat(n-1, vector<ll>(n-1));
  94.     ll xn = binpow(x, n);
  95.     for(int i = 0; i<n-1; i++){
  96.         for(int j = 0; j<n-1; j++){
  97.             ll ca = arr[i][j][0], cb = arr[i][j][1], cc = arr[i][j][2];
  98.             mat[i][j] = ((ca + mod) * x)%mod + ((cb + mod) * xn)%mod + mod + cc;
  99.             mat[i][j] %= mod;
  100.             cerr << mat[i][j] << " ";
  101.         }
  102.         cerr << "\n";
  103.     }
  104.    
  105.     ll ans = kactl::det(mat);
  106.     cerr << ans << "\n";
  107.     return ans;
  108. }  
  109.  
  110. vector<ll> mul(vector<ll> a, vector<ll> b){
  111.     vector<ll> c(sz(a) + sz(b) - 1, 0);
  112.     for(int i = 0; i<sz(a); i++){
  113.         for(int j = 0; j<sz(b); j++){
  114.             (c[i + j] += a[i] * b[j]) %= mod;
  115.         }
  116.     }
  117.     return c;
  118. }
  119.  
  120. vector<ll> divide(vector<ll> p, ll x){
  121.     reverse(all(p));
  122.     ll rem = p[0];
  123.     vector<ll> ret;
  124.     for(int i = 1; i<sz(p); i++){
  125.         ret.pb(rem);
  126.         ll nv = rem * x;
  127.         rem = p[i] + nv;
  128.         rem %= mod;
  129.     }
  130.     assert(rem == 0);
  131.     reverse(all(ret));
  132.     return ret;
  133. }
  134.  
  135. void solve(){
  136.     auto st = clock();
  137.     n = in;
  138.     int m = in;
  139.     for(int i = 0; i<m; i++){
  140.         int a = in, b = in;
  141.         int c = in;
  142.         a--, b--;
  143.         c--;
  144.         arr[a][a][c]++;
  145.         arr[b][b][c]++;
  146.         arr[a][b][c]--;
  147.         arr[b][a][c]--;
  148.     }
  149.     for(int i = 0; i<=n*n+5; i++){
  150.         f[i] = F(i);
  151.     }
  152.     big =  {1ll};
  153.     for(int i = 0; i<=n*n; i++){
  154.         big = mul(big, {mod - i, 1ll});
  155.     }
  156.     for(int i = 0; i<=n*n; i++){
  157.         ll bot = 1;
  158.         for(int j = 0; j<=n*n; j++){
  159.             if(i == j) continue ;
  160.             bot *= (i + mod - j);
  161.             bot %= mod;
  162.         }
  163.         vector<ll> top = divide(big, i);
  164.         ll inv = binpow(bot);
  165.         for(ll& x : top){
  166.             (x *= f[i]) %= mod;
  167.             (x *= inv) %= mod;
  168.         }
  169.         for(int j = 0; j<sz(top); j++){
  170.             (g[j] += top[j]) %= mod;
  171.         }
  172.     }
  173.     for(int i = 0; i<n*n; i++){
  174.         oup[i%n][i/n] = g[i];
  175.     }
  176.     for(int i = 0; i<n; i++){
  177.         for(int j = 0; j<n - i; j++){
  178.             cout << oup[i][j] << "\n";
  179.         }
  180.     }      
  181.  
  182. }
  183.  
  184. signed main(){
  185.   cin.tie(0) -> sync_with_stdio(0);
  186.  
  187.   int T = 1;
  188.   //cin >> T;
  189.   for(int i = 1; i<=T; i++){
  190.         solve();
  191.     }
  192.   return 0;
  193. }
  194.  
Advertisement
Add Comment
Please, Sign In to add comment