Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define NMAX (int)(54)
  3. #define MKMAX 130
  4. #define mod (int)(1e9+7)
  5. #define all(x) x.begin(),x.end()
  6. #define rep(i, l, r) for(int i = l; i < r; ++i)
  7. #define rev(i, r, l) for(int i = r - 1; i >= l; --i)
  8. #define ft first
  9. #define sd second
  10. #define pb push_back
  11. using namespace std;
  12. typedef long long ll;
  13. typedef pair <int, int> pii;
  14. struct matrix{
  15.     ll mat[MKMAX][MKMAX],n;
  16.     ll *operator[](const int p){
  17.         return mat[p];
  18.     }
  19.     matrix operator*(const matrix& oth){
  20.         matrix sol;
  21.         sol.n=n;
  22.         rep(i, 0, n)
  23.             rep(j, 0, n)
  24.                 rep(k, 0, n)
  25.                     sol[i][j]=(sol[i][j] + mat[i][k] * oth.mat[k][j])%mod;
  26.         return sol;
  27.     }
  28.     void I(){
  29.         rep(i, 0, n)
  30.             mat[i][i]=1;
  31.     }
  32.     matrix(){
  33.         memset(mat, 0, sizeof mat);
  34.         n=0;
  35.     }
  36. };
  37.  
  38. int n,k,sz,ans,cntBit[MKMAX];
  39. int dp[NMAX][MKMAX];/*dp[i][j] = how many sets of type  j
  40.                              are there after traversing the prefix of length i*/
  41. int good[MKMAX][MKMAX][2],trans[MKMAX][MKMAX];
  42. string s;
  43.  
  44. vector <int> part; //all partitions with an even number of bits
  45. vector <int> poss; //all possible states that we can reach from our mask
  46.  
  47. inline bool bit(int,int);
  48. void precalc();
  49. matrix expLog(matrix,int);
  50.  
  51. int main(){
  52.     cin>>n>>k;
  53.     cin>>s;
  54.     s=" " + s;
  55.     sz=s.size();
  56.     precalc();
  57.     rep(msk, 0, (1<<n)){//what states do we reach from msk after traversing s
  58.         memset(dp, 0, sizeof dp);
  59.         poss.clear();
  60.         rep(t, 0, (1<<n))
  61.             if((t & msk) == msk)
  62.                 poss.pb(t);
  63.         int temp;
  64.         dp[0][msk]=1;
  65.         rep(i, 1, sz)
  66.             for(auto t:poss)
  67.                 for(auto ad:part){
  68.                     if(good[t][ad][s[i]-'0'] == -1) continue;
  69.                     temp=good[t][ad][s[i]-'0'];
  70.                     dp[i][temp]=(dp[i][temp] + dp[i-1][t])%mod;
  71.                 }
  72.         for(auto t:poss)
  73.             trans[msk][t]=dp[sz-1][t];
  74.     }
  75.     matrix T;
  76.     T.n=(1<<n);
  77.     rep(i, 0, T.n)
  78.         rep(j, 0, T.n)
  79.             T[i][j]=trans[i][j];
  80.     T=expLog(T, k);
  81.     cout<<T[0][(1<<n)-1];
  82.     return 0;
  83. }
  84. void precalc(){
  85.     part.pb(0);
  86.     rep(msk, 1, (1<<n)){
  87.         cntBit[msk]=cntBit[msk&(msk-1)]+1;
  88.         if(!(cntBit[msk]&1))//so their xor is zero
  89.             part.pb(msk);
  90.     }
  91.     bool ok;
  92.     int temp;
  93.     rep(msk, 0, (1<<n))
  94.         for(auto ad:part){
  95.             ok=1;
  96.             rep(i, 0, n-1)
  97.                 if(bit(ad, i) && !bit(msk, i) && !bit(ad,i+1)){
  98.                     ok=0;
  99.                     break;
  100.                 }
  101.  
  102.             if(ok){
  103.                 temp=msk;
  104.                 rep(i, 0, n-1)
  105.                     if(!bit(msk, i) && !bit(ad, i) && bit(ad, i+1))
  106.                         temp|=(1<<i);
  107.  
  108.                 good[msk][ad][0]=temp;
  109.                 if(!bit(ad, n-1))
  110.                     temp|=(1<<(n-1));
  111.                 good[msk][ad][1]=temp;
  112.             }else
  113.                 good[msk][ad][0]=good[msk][ad][1]=-1;
  114.             if(bit(ad, n-1) && !bit(msk, n-1))
  115.                 good[msk][ad][0]=-1;
  116.         }
  117.  
  118. }
  119. matrix expLog(matrix x,int k){
  120.     matrix sol;
  121.     sol.n=(1<<n);
  122.     sol.I();
  123.     for(;k;k>>=1){
  124.         if(k&1)
  125.             sol=sol*x;
  126.         x=x*x;
  127.     }
  128.     return sol;
  129. }
  130. inline bool bit(int x,int k){
  131.     return x & (1<<k);
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement