https://ac.nowcoder.com/acm/contest/5389/A
我觉得挺容易的,不要想得太复杂了,就取模取模取模。

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;

int main()
{
    long long n;
    long long res=1;
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        res*=i;
        res%=mod;
    }
    printf("%lld\n",res);
    return 0;
} 

https://ac.nowcoder.com/acm/contest/5389/B
贪心,尽量的贪心。(我是这样的想的)
先计算所给n个数的和。如果比m大于或者等于,那么次数为0,如果小于,就用9减去这些数,用得到剩下的数去凑一个大于或者等于m的数。

#include<bits/stdc++.h>
using namespace std;
int num[100];

int main()
{
    int n,m;
    int a,cnt=0;
    long long sum=0;
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        cin>>a;
        sum+=a;
        num[9-a]++;
    }
    if(sum>=m)
        printf("0\n");
    else
    {
        sum=m-sum;
        int p=0;
        for(int i=9;i>=0;i--)
        {
            for(int j=0;j<=num[i];j++)
            {
                if(j!=0)
                {
                    sum-=i;
                    cnt++;
                    if(sum<=0)
                    {
                        p=1;
                        break;
                    }
                }
            }
            if(p==1) break;
        }
        printf("%d\n",cnt);
    }
    return 0;
}