Submission #21415

#TimeUsernameProblemLanguageResultExecution timeMemory
21415gs14004비트 (kriii4_Q)C++11
100 / 100
229 ms2384 KiB
#include <bits/stdc++.h> using namespace std; typedef long long lint; typedef pair<int, int> pi; const int mod = 1e9 + 7; lint ipow(lint x, lint p){ lint ret = 1, piv = x % mod; while(p){ if(p&1) ret *= piv; piv *= piv; ret %= mod; piv %= mod; p >>= 1; } return ret % mod; } const int MAXN = 105; struct matrix{ lint adj[MAXN][MAXN]; int n; matrix(int _n, int c){ n = _n; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ adj[i][j] = (i == j ? c : 0); } } } matrix operator*(const matrix &a)const{ matrix c(n, 0); for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ for(int k=0; k<n; k++){ c.adj[j][k] += adj[j][i] * a.adj[i][k] % mod; c.adj[j][k] %= mod; } } } return c; } }; int n, k; vector<lint> basis[102]; lint sol[102]; void solve(){ for(int i=n-1; i>=0; i--){ assert(!basis[i].empty()); for(int j=i+1; j<n; j++){ sol[i] += mod - sol[j] * basis[i][j] % mod; sol[i] %= mod; } sol[i] *= ipow(basis[i][i], mod - 2); sol[i] %= mod; } for(int i=0; i<n; i++) printf("%lld\n", sol[i]); } void insert(vector<lint> v, int x){ bool ok = 0; for(int i=0; i<n; i++){ if(v[i]){ if(basis[i].empty()){ basis[i] = v; sol[i] = x; ok = 1; break; } else{ lint w = ipow(basis[i][i], mod - 2) * v[i] % mod; for(int j=0; j<n; j++){ v[j] += mod - w * basis[i][j] % mod; v[j] %= mod; } x += mod - w * sol[i] % mod; x %= mod; } } } assert(ok); } int main(){ cin >> n >> k; matrix ret(n+1, 1), piv(n+1, 0); for(int i=0; i<=n; i++){ if(i < n) piv.adj[i][i+1] = (n - i) * ipow(n, mod-2) % mod; if(i > 0) piv.adj[i][i-1] = i * ipow(n, mod-2) % mod; } for(; k; k>>=1){ if(k&1) ret = ret * piv; piv = piv * piv; } for(int i=0; i<n; i++){ vector<lint> rw(n); rw[i]++; for(int j=0; j<n; j++){ rw[j] += mod - ret.adj[i+1][j+1]; rw[j] %= mod; } insert(rw, 1); } solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...