题意:一个长为n的序列,每个位置上的值是0,1,2,3中的一个,有m个限制条件,限制位置[l[i],r[i]]中不同的数值有x[i]个,问方案数MOD 998244353
n<=100,m<=100
思路:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef pair<int,int> PII; 7 typedef pair<ll,ll> Pll; 8 typedef vector<int> VI; 9 typedef vector<PII> VII; 10 typedef pair<ll,int>P; 11 #define N 110 12 #define M 151000 13 #define fi first 14 #define se second 15 #define MP make_pair 16 #define pi acos(-1) 17 #define mem(a,b) memset(a,b,sizeof(a)) 18 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 19 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 20 #define lowbit(x) x&(-x) 21 #define Rand (rand()*(1<<16)+rand()) 22 #define id(x) ((x)<=B?(x):m-n/(x)+1) 23 #define ls p<<1 24 #define rs p<<1|1 25 26 const int MOD=998244353,inv2=(MOD+1)/2; 27 double eps=1e-6; 28 ll INF=1e18; 29 ll inf=5e13; 30 int dx[4]={-1,1,0,0}; 31 int dy[4]={0,0,-1,1}; 32 33 int dp[2][N][N][N]; 34 VII c[N]; 35 36 int read() 37 { 38 int v=0,f=1; 39 char c=getchar(); 40 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 41 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 42 return v*f; 43 } 44 45 void calc(int &a,int b) 46 { 47 a+=b; 48 if(a>=MOD) a-=MOD; 49 } 50 51 int main() 52 { 53 //freopen("1.in","r",stdin); 54 //freopen("1.out","w",stdout); 55 int cas=read(); 56 while(cas--) 57 { 58 int n=read(),m=read(); 59 rep(i,1,n) c[i].clear(); 60 rep(i,1,m) 61 { 62 int x=read(),y=read(),z=read(); 63 //printf("x=%d y=%d z=%d\n",x,y,z); 64 c[y].push_back(MP(x,z)); 65 } 66 rep(i,0,n) 67 rep(j,0,n) 68 rep(k,0,n) dp[0][i][j][k]=0; 69 dp[0][0][0][0]=1; 70 int v=0; 71 rep(i,1,n) 72 { 73 v^=1; 74 rep(j,0,i) 75 rep(k,0,j) 76 rep(t,0,k) dp[v][j][k][t]=0; 77 rep(j,0,i-1) 78 rep(k,0,j) 79 rep(t,0,k) 80 { 81 calc(dp[v][j][k][t],dp[1-v][j][k][t]); 82 calc(dp[v][i-1][k][t],dp[1-v][j][k][t]); 83 calc(dp[v][i-1][j][t],dp[1-v][j][k][t]); 84 calc(dp[v][i-1][j][k],dp[1-v][j][k][t]); 85 } 86 rep(j,0,i-1) 87 rep(k,0,j) 88 rep(t,0,k) 89 { 90 for(int x=0;x<c[i].size();x++) 91 { 92 PII tmp=c[i][x]; 93 if((j>=tmp.fi)+(k>=tmp.fi)+(t>=tmp.fi)+1!=tmp.se) dp[v][j][k][t]=0; 94 } 95 } 96 } 97 int ans=0; 98 rep(i,0,n-1) 99 rep(j,0,i) 100 rep(k,0,j) calc(ans,dp[v][i][j][k]); 101 printf("%d\n",ans); 102 103 } 104 return 0; 105 }