Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //misaka and elaina will carry me to master
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <utility>
- #include <cassert>
- #include <algorithm>
- #include <vector>
- #include <functional>
- #include <ctime>
- #include <cstdlib>
- #include <numeric>
- #include <set>
- #include <array>
- #include <queue>
- #include <map>
- #include <chrono>
- #include <random>
- #define ll long long
- #define lb long double
- #define sz(x) ((int)(x.size()))
- #define all(x) x.begin(), x.end()
- #define pb push_back
- #define mp make_pair
- #define kill(x, s) {if(x){ cout << s << "\n"; return ; }}
- //#ifndef LOCAL
- #define cerr while(0) cerr
- //#endif
- const lb eps = 1e-9;
- const ll mod = 1e9 + 7, ll_max = 1e18;
- //const ll mod = (1 << (23)) * 119 +1, ll_max = 1e18;
- const int MX = 50 +10, int_max = 0x3f3f3f3f;
- struct {
- template<class T>
- operator T() {
- T x; std::cin >> x; return x;
- }
- } in;
- using namespace std;
- namespace kactl{
- #define rep(i, a, b) for(int i = a; i<b; i++)
- ll det(vector<vector<ll>>& a) {
- int n = sz(a); ll ans = 1;
- rep(i,0,n) {
- rep(j,i+1,n) {
- while (a[j][i] != 0) { // gcd step
- ll t = a[i][i] / a[j][i];
- if (t) rep(k,i,n)
- a[i][k] = (a[i][k] - a[j][k] * t) % mod;
- swap(a[i], a[j]);
- ans *= -1;
- }
- }
- ans = ans * a[i][i] % mod;
- if (!ans) return 0;
- }
- return (ans + mod) % mod;
- }
- }
- ll binpow(ll a, ll b = mod -2){
- ll ans = 1;
- for(ll i = 1; i<=b; i*=2ll){
- if(b&i) (ans *= a) %= mod;
- (a *= a) %= mod;
- }
- return ans;
- }
- int n;
- //coeff of x^0, x^1, x^n respectively
- array<int, 3> arr[MX][MX];
- vector<ll> big;
- ll f[MX*MX];
- ll g[MX*MX];
- ll oup[MX][MX];
- ll F(ll x){
- cerr << x << ": \n";
- vector<vector<ll>> mat(n-1, vector<ll>(n-1));
- ll xn = binpow(x, n);
- for(int i = 0; i<n-1; i++){
- for(int j = 0; j<n-1; j++){
- ll ca = arr[i][j][0], cb = arr[i][j][1], cc = arr[i][j][2];
- mat[i][j] = ((ca + mod) * x)%mod + ((cb + mod) * xn)%mod + mod + cc;
- mat[i][j] %= mod;
- cerr << mat[i][j] << " ";
- }
- cerr << "\n";
- }
- ll ans = kactl::det(mat);
- cerr << ans << "\n";
- return ans;
- }
- vector<ll> mul(vector<ll> a, vector<ll> b){
- vector<ll> c(sz(a) + sz(b) - 1, 0);
- for(int i = 0; i<sz(a); i++){
- for(int j = 0; j<sz(b); j++){
- (c[i + j] += a[i] * b[j]) %= mod;
- }
- }
- return c;
- }
- vector<ll> divide(vector<ll> p, ll x){
- reverse(all(p));
- ll rem = p[0];
- vector<ll> ret;
- for(int i = 1; i<sz(p); i++){
- ret.pb(rem);
- ll nv = rem * x;
- rem = p[i] + nv;
- rem %= mod;
- }
- assert(rem == 0);
- reverse(all(ret));
- return ret;
- }
- void solve(){
- auto st = clock();
- n = in;
- int m = in;
- for(int i = 0; i<m; i++){
- int a = in, b = in;
- int c = in;
- a--, b--;
- c--;
- arr[a][a][c]++;
- arr[b][b][c]++;
- arr[a][b][c]--;
- arr[b][a][c]--;
- }
- for(int i = 0; i<=n*n+5; i++){
- f[i] = F(i);
- }
- big = {1ll};
- for(int i = 0; i<=n*n; i++){
- big = mul(big, {mod - i, 1ll});
- }
- for(int i = 0; i<=n*n; i++){
- ll bot = 1;
- for(int j = 0; j<=n*n; j++){
- if(i == j) continue ;
- bot *= (i + mod - j);
- bot %= mod;
- }
- vector<ll> top = divide(big, i);
- ll inv = binpow(bot);
- for(ll& x : top){
- (x *= f[i]) %= mod;
- (x *= inv) %= mod;
- }
- for(int j = 0; j<sz(top); j++){
- (g[j] += top[j]) %= mod;
- }
- }
- for(int i = 0; i<n*n; i++){
- oup[i%n][i/n] = g[i];
- }
- for(int i = 0; i<n; i++){
- for(int j = 0; j<n - i; j++){
- cout << oup[i][j] << "\n";
- }
- }
- }
- signed main(){
- cin.tie(0) -> sync_with_stdio(0);
- int T = 1;
- //cin >> T;
- for(int i = 1; i<=T; i++){
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment