题意:
现在有2n的矩阵,有一些位置有值,现在你要将剩下的位置填入0-9这些值,使得任意的连续的23的矩阵的值得和为k。问你有多少种情况。
题解:
我nmdp写了半天,最后才知道是个暴力的水题。心态崩了
如果确定第一个和第二个位置的值,x,y,那么第3个位置为k-x-y。那么第4个位置就是x,第5个位置就是y。。这是一定的。那么就枚举前两列的值,然后看有多少种情况即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define ll long long
const ll mod=1e9+7;
ll cas[3][40];
int mp[N][2];
int main()
{
for(int i=0;i<=9;i++)
cas[1][i]=1;
for(int i=0;i<=18;i++)
for(int k=0;k<=min(9,i);k++)
cas[2][i]+=cas[1][i-k];
cas[0][0]=1;
int n,k,m;
scanf("%d%d%d",&n,&k,&m);
int x,y,v;
memset(mp,-1,sizeof(mp));
for(int i=1;i<=m;i++)
scanf("%d%d%d",&x,&y,&v),mp[x][y]=v;
int val[3];
ll ans=0;
for(val[0]=0;val[0]<=min(18,k);val[0]++){
for(val[1]=0;val[1]<=min(18,k-val[0]);val[1]++){
val[2]=k-val[0]-val[1];
if(val[2]>=0&&val[2]<=18){
ll ret=1;
for(int i=0;i<n;i++){
int sum=0,num=0;
sum+=mp[i][0]==-1?0:mp[i][0];
sum+=mp[i][1]==-1?0:mp[i][1];
num+=mp[i][0]==-1?0:1;
num+=mp[i][1]==-1?0:1;
if(sum>val[i%3])
ret=0;
ret=ret*cas[2-num][val[i%3]-sum]%mod;
if(!ret)
break;
}
ans=(ans+ret)%mod;
}
}
}
printf("%lld\n",ans);
return 0;
}