Find a car problem solution

Find a car problem solution

Nausea title.
Title link
First Law it is difficult to find:
\ (A [I] [J] = (. 1-I) \) ^ \ ((. 1-J) + 1'd \ sum_ {I}. 1 = X ^ {} \ sum_ {J = 1} ^ {y} (
a [i] [j] <= k) \) and magic digital DP, an enumeration of which one each is 0, 1, meets restrictions i, j, k, and (1 is not satisfied, 0 is satisfied.)

#include<bits/stdc++.h>
#define ll long long
#define work(x,y,z) if(i>1||w==x) dfs2(i>>1,state,y,z,i>1?w^x:w)
using namespace std;
const ll mod=1e9+7;
int t,t1,t2,t3,t4,k;
ll q,fs[12],fc[12],gs[12],gc[12];
inline void add(ll &x){if(x>=mod)x-=mod;}
inline int read(){
   int T=0,F=1; char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}
   while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();
   return F*T; 
}
void dfs2(int i,int state,int u,int v,int w){
    if(!i){
      if(w) fs[v]=(fs[v]+q*gc[u])%mod;
      add(fs[v]+=gs[u]); add(fc[v]+=gc[u]);
      return;
    }
    if(i&state){work(0,u,v|i); work(1,u,v);}//有限制,这一位可以选1,可以选0
    else work(0,u,v);//有限制,只能选0
    work(0,u|i,v|i); work(1,u|i,v|i);//无限制,即可以选0,也可以选1
}//搜索这一位选择,满足x,y,z哪些的限制
ll dfs(ll x,ll y,ll z){
   if(x<0||y<0||z<0) return 0;
   ll ans=0;
   memset(gc,0,sizeof(gc)),memset(gs,0,sizeof(gs)),gc[0]=1;
   for(int i=(1<<30);i;i>>=1){
       q=i,dfs2(4,(((x&i)>0)*4)|(((y&i)>0)*2)|((z&i)>0),0,0,0);
       memcpy(gc,fc,sizeof(fc)),memcpy(gs,fs,sizeof(fs));
       memset(fc,0,sizeof(fc)),memset(fs,0,sizeof(fs));
   }
   for(int i=0;i<8;++i) add(ans+=gc[i]),add(ans+=gs[i]);
   return ans;
}
int main(){
   t=read();
   while(t--){
      t1=read()-2,t2=read()-2,t3=read()-1,t4=read()-1,k=read()-1;
      printf("%lld\n",((dfs(t3,t4,k)-dfs(t1,t4,k)-dfs(t3,t2,k)+dfs(t1,t2,k))%mod+mod)%mod);
   }
   return 0;
}

Guess you like

Origin www.cnblogs.com/ljk123-de-bo-ke/p/11838744.html