【HDU 5810多校】Balls and Boxes(打表/数学)
1.打表找规律,下面是打表程序:
#include <iostream> #include <cstdio> #define ll long long #define N 100005 using namespace std; ll n,m,b[N],ans,num; ll sqr(ll x) { return x*x; } void dfs(ll r){ if(r==0){ num++; for(int i=1;i<=m;i++) ans+=sqr(b[i]); return; } for(int i=1;i<=m;i++) { b[i]++; dfs(r-1); b[i]--; } } int main() { while(~scanf("%lld%lld",&n,&m)){ for(ll r=1;r<=n;r++){ ans=num=0; dfs(r); ans=m*ans-r*r*num; num=m*m*num; ll g=__gcd(ans,num); printf("r=%lld: %lld/%lld\n",r,ans/g,num/g); } } }
2.数学
V其实就是二项式分布的方差,可以这么理解:
样本是第i个盒子:每次把1个球扔进第i个盒子的概率都是1/m,扔不进就是1-1/m,扔了n个球,于是Xi服从二项式分布。
那么就可以直接用二项式的方差公式$D(X)=n\cdot p\cdot (1-p)$ 这里的p就是1/m。下面是AC程序:
#include <algorithm> #include <cstdio> #define ll long long using namespace std; ll n,m; int main() { while(scanf("%lld%lld",&n,&m),n){ ll a=n*(m-1),b=m*m; ll g=__gcd(a,b); printf("%lld/%lld\n",a/g,b/g); } }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆