数字游戏-困难版本

1.这是一个排列问题,用字符串s读取b,创建数组a[10],记录s中没有的0-9的字符共k个,

小心0的情况,如果s中有‘0’,让a[0]=-1;

2.如果s中有‘0’,满足条件的数字的个数为sum=fun(k,n);fun()函数和pow()函数一样,我怕数据超出范围,在fun()函

数里取模,防止数值溢出

3.如果s中没有‘0’,满足条件的数字个数为:sum=(k-1)*fun(k,n-1)%M;最高位不能是0,最高位有k-1中可能。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <math.h>
#include <string>
#define M 998244353
using namespace std;
int n;
string s;
int a[10];
long long fun(int k,int n)
{
    long long ans=1;
    for(int i=1;i<=n;i++)
    {
        ans*=k;
        ans%=M;
    }
    return ans;
}
int main()
{
    memset(a,0,sizeof(a));
    scanf("%d",&n);
    cin>>s;
    for(int i=0;i<=9;i++) {
        for(int j=0;j<n;j++) {
            if(s[j]-'0'==i) a[i]++;
            if(s[j]=='0') a[0] = -1;
        }
            
    }
    //cout<<"a[o]   "<<a[0]<<endl;
    int k=0;
    for(int i=0;i<=9;i++)
        if(a[i]==0) 
        {
            k++;
         //   cout<<" a  "<<i<<endl;
        }
   // cout<<"k=  "<<k<<endl;
    long long sum=0;
    if(a[0]==-1) {
       sum=fun(k,n);
    }
    else {
        sum=(k-1)*fun(k,n-1)%M;
    }
   // cout<<fun(2,3)<<endl;
    if(n==1)
        printf("9");
    else
        printf("%lld",sum);
    return 0;

}