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; }
   |