t1
f(i)表示不和法數大於i個的數量
$$f(i)=c_n^ic_^$$
首先n>m||k*n
先不考慮
用擋板法易知
$$ans=c_^$$
即給m個果子中間再加上n-1個擋板的位置,在選n-1個
那考慮必須放乙個的情況,只要預先把m -n,相當於每個籃子先放乙個
那考慮不合法數》=i個,只需要預先給i個放k個,那這i個一定不合法
但是不保證其他的合法,也不保證這i個不合法的果子數一定是k+1個
所以要用到容斥
這種我們確定了i個不合法的最低高度,但是同乙個狀態會被像上圖一樣,被列舉多次
所以要容斥
#include #include #include #include #include #include #define mem(a,b) memset(a,b,sizeof(a))t1t2#define ll long long
using namespace std;
const int mod=998244353;
const int n=10000066;
ll mi(ll a,ll ci)
return ans;
}ll jie[n],jieni[n];
void chu()
ll n,m,k;
inline ll c(ll n,ll m)
ll ans=0;
for(ll i=0;i<=m;++i)
ans=(ans+c(n,i)*c(m-i*k-1,n-1)%mod*((i&1)?-1:1)+mod)%mod;
cout<
仔細想一想就會發現
一條鏈上、乙個環上只能放乙個
如果有多條鏈、多個環組合在一起,ans還是最長鏈的長度
那只需要tarjan縮個點,再求個最長鏈即可
#include #include #include #include #include #include #define mem(a,b) memset(a,b,sizeof(a))t2然後t3還不會呢...#define ll long long
#define dd double
using namespace std;
inline int read()
return ans;
}const int n=1000006;
struct son
;struct ttt
void addbian(int u,int v)
}h[2];
int n,m;
int dfn[n],low[n],now;
int zhan[n*5],he;
bool flag[n];
int dui[n],con,sun[n];
inline void tarjan(int x)
else
if(flag[temp])
}if(dfn[x]==low[x])
}}void chu()
}}int mx[n];
void dfs(int x)
{ flag[x]=1;
int temp;
mx[x]=sun[x];
for(int i=h[1].first[x];i!=-1;i=h[1].a1[i].next)
{temp=h[1].a1[i].v;
if(flag[temp])
{if(mx[x]
1014下午考試
題目大意 有乙個 n m 的矩陣,矩陣的每個位置上可以放置乙個數。對於第i行,第i行的差異定義為該行的最大數和最小數的差。乙個矩陣的差異,定義為矩陣中每一行差異的最大值。現在給定k個數v 1.k 問 從這k個數中選 n m 個數放入矩陣,能夠得到的矩陣的差異最小值是多少。n m k 100000,n...
10 30 下午考試
p76 年?月?日?題目名稱 他 她 它 名稱 he she it 輸入 he.in she.in it.in 輸出 he.out she.out it.out 每個測試點時限 1 秒 1 秒 1 秒 記憶體限制 512mb 512mb 512mb 測試點數目 10 10 10 每個測試點分值 10...
4 27 下午 閱讀
預設進入系統,我們會看到這樣的字元 root localhost 其中 代表當前是 root 使用者登入,如果是 表示當前為普通使用者。我們了解linux由很多目錄檔案構成,那我們來學習第乙個 linux 命令 cd命令,cd home 解析 進入 home 目錄cd root 進入 root 目錄...