ENDER 太强了 %%%%%% orz
一.wait
题目描述
题目描述 有一的棋盘,每次随机染黑一个位置(可能染到已经黑了的),当某一行或者一列全为黑色时停止,求期望染色次数()
输入格式
一行两个正整数
输出格式
期望结果
样例
样例输入1
2 2
样例输出1
3
样例输入2
10 20
样例输出2
397903748
n <= 1000
又是一道数论题.....mmp
前置知识(芝士)
min-max反演
还是安利博客吧,插入公式用不了
分析
好了,但是好像这道题跟反演没有太大关系,需要把题意变一下
令a[i]表示第i行最多需要通过多少步来填满
b[i]表示第i列最多需要通过多少步来填满
那么就有一个集合:S{ a ,b }
那么现在就要算期望值了
min(S)=∑T⊆S(−1)|T|+1max(T)
也就是从T就是从a里面随机选i个,b里面从中选j个组成的集合
那么需要染成的格子有: i*m+j*n-i*j
推理:如果只有一个格子需要染色,那么其期望就是 nm
如果有两个格子需要染色,那么期望就是nm/2+nm,先染一个,再染一个
那么k个格子就是nm(1 + 1/2 + 1/3 +....+k/1)
由于条件有限,所以格式不好见谅
那么就可以用这个算出来max(T),min(S)也可以了
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
const int MAXN = 1000 * 1003;
const ll mod = 998244353;
ll n , m;
ll niv[MAXN] , sum[MAXN] , fac[MAXN];
ll C ( ll x , ll y ){
return fac[x] * niv[y] % mod * niv[x-