共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。

img

img

#include
#include
float aaa(int n, int m)
{
    if (n == 1)
    {
        return m;
    }
    else
        return m * aaa(n - 1, m - 1) / n;
}
int main()
{
    float n = 0, m = 0, P = 0, i = 0,sum1=1,sum2=1,sum3=1,j=0,a=0;
    scanf("%f%f", &n, &m);
    if (((20 >= n) && (n >= 1)) && ((m >= 1) && (m <= 20)))
    {
        sum1 = aaa(n, m);
        sum2 *= pow(1/n,n);
        P = sum1 * sum2;
        printf("%.4lf", P);
    }
    return 0;
}

我想问一下我这个哪里错了呀

#include<stdio.h>
#include<math.h>
double dp[22];
long long c_fun(int n,int m)//求组合数C(n,m); 
{
    long i;
    long long ans_n=1,ans_m=1,ans_nm=1;
    for(i=2;i<=n;i++)
        ans_n=ans_n*i;
    for(i=2;i<=m;i++)
        ans_m=ans_m*i;
    for(i=2;i<=n-m;i++)
        ans_nm=ans_nm*i;
    return ans_n/(ans_m*ans_nm);
    
} 
double fun(int n,int m)//求解印章问题 
{
    int i,j;
    double t=0;
    dp[1]=1.0;//只需凑齐1种,必定可以凑齐 
    for(i=2;i<=n;i++)//循环,计算需凑齐2,3,4...n种的情况 
    {
        t=0;
        for(j=1;j<i;j++)
        {
            t=t+c_fun(i,j)*dp[j]*pow(j,m);//递推公式 
                    
        }
        dp[i]=1-t/pow(i,m);
    
    }
    return dp[n];
} 
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    fun(n,m);//求解 
    printf("%.4lf\n",dp[n]);
    return 0;
}

你看看这个对么?

```c++


```