数字游戏-困难版本
数字游戏(困难版本)
https://ac.nowcoder.com/acm/contest/32992/J
数字游戏-困难版本
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; }
指尖的温柔梦 文章被收录于专栏
每天在博客写一些题解,为了思路更加清晰。