1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector>
using namespace std; const int N=1e3+10,K=50+10,mod=998244353; struct BigInt { vector<int>a; BigInt(){} BigInt(int s){while(s)a.push_back(s%10),s/=10;} int& operator[](const int &x){return a[x];} int len(){return a.size();} void get() { char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9')a.push_back(ch^48),ch=getchar(); reverse(a.begin(),a.end()); } }L,R; inline BigInt operator+(BigInt a,BigInt b) { int si=max(a.len(),b.len()),s=0; BigInt res; a.a.resize(si,0),b.a.resize(si,0); for(int i=0;i<si;i++)res.a.push_back(a[i]+b[i]+s),s=res[i]>=10,res[i]%=10; if(s)res.a.push_back(s); return res; }; inline BigInt operator*(BigInt a,int b) { if(!b)return BigInt(); int si=a.len(),s=0; BigInt res; a.a.resize(si,0); for(int i=0;i<si;i++)res.a.push_back(a[i]*b+s),s=res[i]/10,res[i]%=10; while(s)res.a.push_back(s%10),s/=10; return res; };
int n,maxlen; int pw[N]; int fac,C[N][N],S[K<<1][K<<1]; inline void adj(int &x){x+=x>>31&mod;} inline int qpow(int x,int k=mod-2) { int res=1; while(k) { if(k&1)res=1ll*res*x%mod; x=1ll*x*x%mod; k>>=1; } return res; } struct poly { int a[K]; poly(){memset(a,0,sizeof(a));} poly(int v){a[0]=1;for(int i=1;i<n;i++)a[i]=1ll*a[i-1]*v%mod;} int& operator[](const int &x){return a[x];} poly operator*(poly b)const { poly res; for(int i=0;i<n;i++) for(int j=0;j<n-i;j++) adj(res[i+j]+=1ll*a[i]*b[j]%mod*C[i+j][i]%mod-mod); return res; } void operator+=(poly b){for(int i=0;i<n;i++)adj(a[i]+=b[i]-mod);} }f[N][10]; inline int sovle(BigInt s) { poly res; int sum=0,len=s.len(); for(int i=len-1;~i;i--)sum=(10ll*sum+s[i])%mod; for(int i=len+1;i<=maxlen;i++) for(int j=1;j<10;j++) res+=f[i][j]*poly(mod-sum); for(int i=len-1,pre=9;~i;i--) { for(int j=s[i]+1;j<=pre;j++)res+=f[i+1][j]*poly(mod-sum); if(s[i]>pre)break; adj(sum-=1ll*pw[i]*s[i]%mod); pre=s[i]; if(!i)res+=poly(0); } res=res*poly(n-1); int ans=0; for(int i=0;i<n;i++) adj(ans+=1ll*((n-1-i)&1?mod-res[i]:res[i])*S[n-1][i]%mod-mod); return 1ll*ans*fac%mod; }
int main() { L.get(),R.get(); scanf("%d",&n); maxlen=R.len()+3; for(int i=C[0][0]=1;i<=N-10;i++) for(int j=C[i][0]=1;j<=i;j++) adj(C[i][j]=C[i-1][j-1]+C[i-1][j]-mod); for(int i=S[0][0]=1;i<=n;i++) for(int j=1;j<=i;j++) adj(S[i][j]=S[i-1][j-1]+1ll*S[i-1][j]*(i-1)%mod-mod); for(int i=fac=1;i<n;i++)fac=1ll*fac*i%mod; fac=qpow(fac); for(int i=pw[0]=1;i<=maxlen;i++)pw[i]=10ll*pw[i-1]%mod; for(int i=0;i<=9;i++)f[1][i]=poly(i); for(int i=1;i<maxlen;i++) for(int j=0;j<10;j++) for(int k=j;k<10;k++) f[i+1][k]+=f[i][j]*poly(1ll*pw[i]*k%mod); int ans=0; for(int i=0;i<=n;i++) { int res=1ll*sovle(L*(n-i)+(R+1)*i)*C[n][i]%mod; adj(ans+=(i&1?-res:res-mod)); } printf("%d\n",ans); return 0; }
|