日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

玲珑oj 1032A-B(组合数学)

發(fā)布時(shí)間:2023/12/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玲珑oj 1032A-B(组合数学) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1032 - A-B

Time Limit:1s?Memory Limit:128MByte

Submissions:528Solved:105

DESCRIPTION
你有n個(gè)球,需要把他們放到m個(gè)盒子里。要求擁有最多球的盒子唯一,問(wèn)方案數(shù)。
INPUT
一行兩個(gè)數(shù)n、m(n、m≤500)
OUTPUT
一行一個(gè)數(shù),表示方案數(shù)。答案對(duì)998244353取模。
SAMPLE INPUT
5 2
SAMPLE OUTPUT
6


思路:

測(cè)試數(shù)據(jù)很水,很暴力的dp也能過(guò),O(n^3)

dp[i][j]表示i個(gè)盒子里面一共放了j個(gè)球的情況。

假設(shè)球數(shù)最多的盒子里面放了k個(gè)球,那么剩下的m-1個(gè)盒子里面只能放n-k個(gè)球,每個(gè)盒子最多[0,k-1]個(gè)球。

dp[i][j] = ∑dp[i-1][j-x], x∈[0, k]。

用pre[i][j]來(lái)求dp[i][j]的前綴和來(lái)優(yōu)化一下。

#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; #define ll long long const ll mod = 998244353; ll dp[550][550]; ll pre[550][550];int main(){int n, m;scanf("%d%d", &n, &m);dp[0][0] = 1;for(int i=0; i<=n; i++) pre[0][i]=1;ll ans=0;for(int k=0; k<=n; k++){for(int i=1; i<m; i++){for(int j=0; j<=n; j++){dp[i][j]=0;/*for(int x=0; x<k; x++){ll sum = j-x>=0 ? dp[i-1][j-x]:0;dp[i][j] = (dp[i][j]+sum)%mod;}*/dp[i][j] = (pre[i-1][j] - (j-k>=0?pre[i-1][j-k]:0) + mod)%mod;pre[i][j] = ((j==0?0:pre[i][j-1]) + dp[i][j])%mod;}}ans = (ans+m*dp[m-1][n-k])%mod;} printf("%lld\n", ans);return 0; }
看了玲瓏oj上面的題解,知道了一種 組合數(shù)學(xué)+容斥的解法

【ps:玲瓏oj上面的題解有點(diǎn)小錯(cuò)誤,,這個(gè)式子里減去的那部分忘記 *(-1)^k,整個(gè)式子要乘以盒子的數(shù)量,也就是m,非球的數(shù)量n】

利用容斥原理,最終的方案數(shù)=總方案數(shù)-不合法的方案數(shù)

find(i, j)表示將i個(gè)球放到j(luò)個(gè)盒子里的方案數(shù),盒子里面允許為空

find(i, j) = C[i+j-1][j-1] 【這個(gè)公式不懂的可以參照這個(gè)博客:codeforces397C】

先枚舉第一個(gè)盒子的數(shù)量,假設(shè)這是球數(shù)量最多的一個(gè)盒子,記為x,然后枚舉有k個(gè)盒子球的數(shù)量>=第一個(gè)盒子

因此 ans = m*( find(n, m) - ∑((-1)^k) * (C[m-1][k] * find(n-x*(k+1),m-1) ) ), x∈[0,n], k∈[1,m-1]

#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> using namespace std; #define ll long long const ll mod = 998244353; ll C[1050][1050];ll find(int x, int y){if(x+y-1<0 || y-1<0) return 0;return C[x+y-1][y-1]; }int main(){int n, m;scanf("%d%d", &n, &m);C[0][0]=1;C[1][0] = C[1][1] = 1; for (int i = 2; i <= 1000; i++){ C[i][0] = 1; for (int j = 1; j <= 1000; j++) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod; } ll ans = 0;for(int x=0; x<=n; x++){for(int k=1; k<m; k++){ll sum = find(n-x*(k+1), m-1);ans = (ans + (k%2==1?1:-1)*C[m-1][k]*sum%mod)%mod;ans = (ans+mod)%mod;}}ans = (find(n, m)-ans+mod)%mod;ans = m*ans%mod;printf("%lld\n", ans);return 0; }













總結(jié)

以上是生活随笔為你收集整理的玲珑oj 1032A-B(组合数学)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。