CTU Open Contest 2019 I. Sixpack —— 思维,暴力

This way

题意:

现在有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;
}

发布了554 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/104449361