Advertisement
yicongli

HDU6391

Mar 12th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int p=19260817;
  17.  
  18. int f[25][45];
  19. int fac[45];
  20. int facinv[45];
  21. char s[45];
  22. char t[45];
  23.  
  24. inline int add(int a,int b){
  25.     return (a+=b)>=p?a-p:a;
  26. }
  27.  
  28. inline int sub(int a,int b){
  29.     return (a-=b)<0?a+p:a;
  30. }
  31.  
  32. inline ll qpow(ll a,ll b){
  33.     ll ans=1;
  34.     while(b){
  35.         if(b&1)(ans*=a)%=p;
  36.         (a*=a)%=p;
  37.         b>>=1;
  38.     }
  39.     return ans;
  40. }
  41.  
  42. inline ll inv(ll a){
  43.     return qpow(a,p-2);
  44. }
  45.  
  46. inline ll C(int n,int m){
  47.     return (n<m)?0:(ll)fac[n]*facinv[m]%p*facinv[n-m]%p;
  48. }
  49.  
  50. signed main(){
  51. //  freopen(".in","r",stdin);
  52. //  freopen(".out","w",stdout);
  53.     int n,k;
  54.     fac[0]=1;
  55.     for(int i=1;i<=40;++i){
  56.         fac[i]=(ll)fac[i-1]*i%p;
  57.     }
  58.     facinv[1]=1;
  59.     for(int i=2;i<=40;++i){
  60.         facinv[i]=(ll)(p-p/i)*facinv[p%i]%p;
  61.     }
  62.     facinv[0]=1;
  63.     for(int i=1;i<=40;++i){
  64.         facinv[i]=(ll)facinv[i]*facinv[i-1]%p;
  65.     }
  66.     for(int cas=1;;++cas){
  67.         r(n),r(k);
  68.         if(!n&&!k)return 0;
  69.         memset(f,0,sizeof(f));
  70.         f[0][0]=1;
  71.         for(int i=1;i<=k;++i){
  72.             for(int j=0;j<=n;++j){
  73.                 if(j+3<=n)f[i][j+3]=add(f[i][j+3],f[i-1][j]*C(j,0)%p*C(n-j,3)%p);
  74.                 if(j+1<=n)f[i][j+1]=add(f[i][j+1],f[i-1][j]*C(j,1)%p*C(n-j,2)%p);
  75.                 if(j-1>=0)f[i][j-1]=add(f[i][j-1],f[i-1][j]*C(j,2)%p*C(n-j,1)%p);
  76.                 if(j-3>=0)f[i][j-3]=add(f[i][j-3],f[i-1][j]*C(j,3)%p*C(n-j,0)%p);
  77.                 if(i-2>=0)f[i][j]=sub(f[i][j],(ll)f[i-2][j]*(i-1)%p*sub(C(n,3),(i-2))%p);
  78.             }
  79.         }
  80.         scanf("%s",s);
  81.         scanf("%s",t);
  82.         int cnt=0;
  83.         for(int i=0;i<n;++i)if(s[i]!=t[i])cnt++;
  84.         printf("Case #%d: %lld\n",cas,(ll)f[k][cnt]*facinv[k]%p*inv(C(n,cnt))%p);
  85.     }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement