首页 > 其他分享 >题解 AT_codefestival_2016_final_f【Road of the King】

题解 AT_codefestival_2016_final_f【Road of the King】

时间:2023-11-13 22:56:05浏览次数:41  
标签:King return int 题解 codefestival dp operator Modint friend

注意到当前移动到的位置并不重要,重要的是经过的点数和 \(1\) 所在强连通分量大小,因此把它们放进状态里:设 \(f_{i,j,k}\) 表示进行 \(i\) 次移动,经过了 \(j\) 个不同的点,此时 \(1\) 所在的强连通分量大小为 \(k\) 的方案数。

考察下一次移动到的点的情况:

  • 没有访问过:共有 \(n-j\) 种此类点,且此时不在 \(1\) 所在强连通分量,因此有转移 \(f_{i+1,j+1,k}\gets f_{i,j,k}\times(n-j)\)。
  • 访问过,不在 \(1\) 所在强连通分量:共有 \(j-k\) 种此类点,此时依然不在 \(1\) 所在强连通分量,因此有转移 \(f_{i+1,j,k}\gets f_{i,j,k}\times(j-k)\)。
  • 访问过,且在 \(1\) 所在强连通分量:共有 \(k\) 种此类点,此时所有访问过的点都并入 \(1\) 所在强连通分量,因此有转移 \(f_{i+1,j,j}\gets f_{i,j,k}\times k\)。

时间复杂度 \(O(n^2m)\)。

// Problem: Road of the King
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/AT_codefestival_2016_final_f
// Memory Limit: 256 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x, y, z) for(int x = (y); x <= (z); ++x)
#define per(x, y, z) for(int x = (y); x >= (z); --x)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do {freopen(s".in", "r", stdin); freopen(s".out", "w", stdout);} while(false)
#define endl '\n'
using namespace std;
typedef long long ll;

mt19937 rnd(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
int randint(int L, int R) {
    uniform_int_distribution<int> dist(L, R);
    return dist(rnd);
}

template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}

template<int mod>
inline unsigned int down(unsigned int x) {
    return x < mod ? x : x - mod;
}

template<int mod>
struct Modint {
    unsigned int x;
    Modint() = default;
    Modint(int x) : x(x) {}
    friend istream& operator>>(istream& in, Modint& a) {return in >> a.x;}
    friend ostream& operator<<(ostream& out, Modint a) {return out << a.x;}
    friend Modint operator+(Modint a, Modint b) {return down<mod>(a.x + b.x);}
    friend Modint operator-(Modint a, Modint b) {return down<mod>(a.x - b.x + mod);}
    friend Modint operator*(Modint a, Modint b) {return 1ULL * a.x * b.x % mod;}
    friend Modint operator^(Modint a, int k) {Modint ans = 1; for(; k; k >>= 1, a *= a) if(k & 1) ans *= a; return ans;}
    friend Modint operator~(Modint a) {return a ^ (mod - 2);}
    friend Modint operator/(Modint a, Modint b) {return a * ~b;}
    friend Modint& operator+=(Modint& a, Modint b) {return a = a + b;}
    friend Modint& operator-=(Modint& a, Modint b) {return a = a - b;}
    friend Modint& operator*=(Modint& a, Modint b) {return a = a * b;}
    friend Modint& operator^=(Modint& a, int k) {return a = a ^ k;}
    friend Modint& operator/=(Modint& a, Modint b) {return a = a / b;}
    friend Modint& operator++(Modint& a) {return a += 1;}
    friend Modint operator++(Modint& a, int) {Modint b = a; ++a; return b;}
    friend Modint& operator--(Modint& a) {return a -= 1;}
    friend Modint operator--(Modint& a, int) {Modint b = a; --a; return b;}
    friend Modint operator-(Modint a) {return a.x == 0 ? 0 : mod - a.x;}
    friend bool operator==(Modint a, Modint b) {return a.x == b.x;}
    friend bool operator!=(Modint a, Modint b) {return !(a == b);}
};

typedef Modint<1000000007> mint;

const int N = 305;

int n, m;
mint dp[N][N][N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> m;
    dp[0][1][1] = 1;
    rep(i, 0, m - 1) {
        rep(j, 1, n) {
            rep(k, 1, j) {
                dp[i + 1][j + 1][k] += dp[i][j][k] * (n - j);
                dp[i + 1][j][k] += dp[i][j][k] * (j - k);
                dp[i + 1][j][j] += dp[i][j][k] * k;
            }
        }
    }
    cout << dp[m][n][n] << endl;
    return 0;
}

标签:King,return,int,题解,codefestival,dp,operator,Modint,friend
From: https://www.cnblogs.com/ruierqwq/p/AT_codefestival_2016_final_f.html

相关文章

  • UVA11282 题解
    题意简述Kelly寄出去\(n\)封邀请函,但她希望只有小于等于\(m\)个人收到他们自己的邀请函(即有至少\(n-m\)个人收到了别人的邀请函)。思路形成容易发现,这道题是一个典型的错排题,我们只需要分别求出\(n-m\)个元素到\(n\)个元素的错排即可。接下来为错排的推导,我们令\(f......
  • [题解] P4755 Beautiful Pair
    P4755BeautifulPair给你一个长度为\(n\)的序列\(a\),求有多少个区间\([l,r]\)满足\(a_l\cdota_r\le\max_{i=l}^ra_i\)。\(n\le10^5,a_i\le10^9\)。首先按最大值位置分治。记当前分治区间为\([l,r]\),分治中心为\(mid\)。那么我们现在要做的就是统计跨......
  • 【题解 P4062 & P8313】 Yazid 的新生舞会&Izbori
    [COCI2021-2022#4]Izbori题目描述Malnar先生正在竞选县长,这个县一共有\(n\)栋房屋,每栋房屋里都住着一位居民。Malnar先生知道,选举的赢家不一定是最好的候选人,而是在选举前举办的宴会最好的候选人。因此,在选举前几天,他将邀请第\(l\)至\(r(l\ler)\)栋房屋内居住的居民,为......
  • 【题解】CF1891E - Brukhovich and Exams
    【题解】CF1891E-BrukhovichandExamshttps://www.luogu.com.cn/problem/CF1891E我们考虑把区间分段:若两个相邻的数不互素,中间分开;若两个相邻的数中有且仅有一个\(1\),中间分开。那么我们得到了两种区间:全\(1\)区间与无\(1\)区间。若两个相邻数在同一区间内,那么就在区间......
  • [题解] CFgym101623F Factor-Free Tree
    Factor-FreeTree当一棵二叉树中的每个节点的权值都与它所有祖先的权值互质时,我们称它为factor-freetree。给你一棵按照中序遍历的顺序的权值序列\(a\),求这个序列是否对应这一棵factor-freetree。如果是就输出每个节点的父亲。\(n\le10^5,a_i\le10^7\)。考虑怎么......
  • SP2139题解
    思路这题数据范围小,暴力就可以了。首先我们用map来统计每个人的下标,用\(bk_{i,j}\)表示第\(i\)个人第\(j\)题是否知道答案。对于每次合作交流,暴力修改就可以了,先统计出两个人的下标,假设一个为\(x\),另一个为\(y\)。然后,如果\(bk_{x,i}\)和\(bk_{y,i}\)中(\(1\lei......
  • [ARC106E] Medals 题解
    题意有一个商店和\(N\)名员工,其中第\(i\)名员工在第\(1\simA_i\)天工作,在第\(A_i+1\sim2\timesA_i\)休息,接下来每\(A_i\)天改变一次状态。每一天你都可以选择一名来上班的员工并为其颁一个奖,求使得每名员工都获得至少\(K\)个奖的最小天数。\(1\leN\le......
  • [题解] CF1156E Special Segments of Permutation
    SpecialSegmentsofPermutation给你一个排列\(p\),求有多少个区间\([l,r]\)满足\(p_l+p_r=\max_{i\in[l,r]}p_i\)。\(n\le2\times10^5\)。按最大值分治,记当前的分治中心为\(mid\),分治区间为\([l,r]\)。然后需要计算跨分治中心的贡献。如果\(mid-l......
  • [题解]AT_abc328_f [ABC328F] Good Set Query
    思路带权并查集模板。如果对于一个三元组\((a,b,c)\)如果它能够添加到\(S\)中一定满足如下条件中的一条:\(X_a,X_b\)满足其中有一个是「不确定」的。在这里\(X_i\)「不确定」指\(X_i\)没有与其它的任意\(X_j\)有关系。\(X_a,X_b\)有间接或直接的关系,但是能计算......
  • CF300B Coach 题解
    闲话调了好一会,甚至还重构了一次代码才对,但是还是很喜欢并查集,并查集可爱捏。题意省流$n$个学生分成$3$人一组,要满足$m$个条件,每个条件给出两个数$x,y$,要求$x$和$y$必须在一个组里。正文要使学生三人一组,一眼使用并查集。首先考虑无解(输出$-1$)的情况:给出的限......