传送门

Time limit : 4sec / Memory limit : 256MB

Score : 1600 points

Problem Statement

There are N(N+1)⁄2 dots arranged to form an equilateral triangle whose sides consist of N dots, as shown below. The j-th dot from the left in the i-th row from the top is denoted by (i,j) (1≤iN, 1≤ji). Also, we will call (i+1,j) immediately lower-left to (i,j), and (i+1,j+1) immediately lower-right to (i,j).

Takahashi is drawing M polygonal lines L1,L2,…,LM by connecting these dots. Each Li starts at (1,1), and visits the dot that is immediately lower-left or lower-right to the current dots N−1 times. More formally, there exist Xi,1,…,Xi,N such that:

  • Li connects the N points (1,Xi,1),(2,Xi,2),…,(N,Xi,N), in this order.
  • For each j=1,2,…,N−1, either Xi,j+1=Xi,j or Xi,j+1=Xi,j+1 holds.

Takahashi would like to draw these lines so that no part of Li+1 is to the left of Li. That is, for each j=1,2,…,N, X1,jX2,j≤…≤XM,j must hold.

Additionally, there are K conditions on the shape of the lines that must be followed. The i-th condition is denoted by (Ai,Bi,Ci), which means:

  • If Ci=0, LAi must visit the immediately lower-left dot for the Bi-th move.
  • If Ci=1, LAi must visit the immediately lower-right dot for the Bi-th move.

That is, XAi,Bi+1=XAi,Bi+Ci must hold.

In how many ways can Takahashi draw M polygonal lines? Find the count modulo 1000000007.

Notes

Before submission, it is strongly recommended to measure the execution time of your code using "Custom Test".

Constraints

  • 1≤N≤20
  • 1≤M≤20
  • 0≤K≤(N−1)M
  • 1≤AiM
  • 1≤BiN−1
  • Ci=0 or 1
  • No pair appears more than once as (Ai,Bi).

Input

Input is given from Standard Input in the following format:

N M K
A1 B1 C1
A2 B2 C2
:
AK BK CK

Output

Print the number of ways for Takahashi to draw M polygonal lines, modulo 1000000007.

Sample Input 1

3 2 1
1 2 0

Sample Output 1

6

There are six ways to draw lines, as shown below. Here, red lines represent L1, and green lines represent L2.

Sample Input 2

3 2 2
1 1 1
2 1 0

Sample Output 2

0

Sample Input 3

5 4 2

1 3 1

4 2 0

Sample Output 3

172

Sample Input 4

20 20 0

Sample Output 4

881396682

题目大意
有一高度为N的三角形,共有M条线从顶部走到底部,要求第L+1条线不能在第L条线的左边,有K个要求,要求第a条线必须在第b层向某方向走(c为一即向左,为二则向右),问共有几种情况
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int dp[1048580];
int need1[21],need2[21];
int put[1048580],go[1048580][21];
//go是记录将一条先向左再向右边翻折后的形状
//put记录自下向上找,第一个向左的边
int n,m,k;
int main()
{     int i,j,p,q,a,b,c;
      scanf("%d%d%d",&n,&m,&k);
      for(i=1;i<=k;i++){
          scanf("%d%d%d",&a,&b,&c);
          a--,b--;
          need1[a]|=(1<<b);
          need2[a]|=(1<<b)*c;
//必须走的路径
      }
      n--;
      memset(go,-1,sizeof(go));
      memset(put,-1,sizeof(put));
      for(i=0;i<(1<<n);i++){
           int num=0;
         for(j=0;j<n;j++)
            if(i&(1<<j)){
              if(j>0&&!(i&(1<<(j-1)))){
                go[i][num]=i^(1<<j)^(1<<(j-1));
//i指路径,num指是第几个向右的边
              }
              num++;
            }
      }
      for(i=0;i<(1<<n);i++)
         for(j=n-1;j>=0;j--){
            if((i&(1<<j)))continue;
            put[i]=i^(1<<j);
            break;
         }
      dp[0]=1;
      for(i=0;i<m;i++){
         for(j=0;j<(1<<n);j++)
            if(put[j]){
              dp[put[j]]+=dp[j];
              dp[put[j]]%=1000000007;
         }
         for(p=0;p<n;p++)
            for(j=(1<<n)-1;j>=0;j--)
               if(go[j][p]!=-1){
                 dp[go[j][p]]+=dp[j],
                 dp[go[j][p]]%=1000000007;
               }
         for(j=0;j<(1<<n);j++)
            if((j&need1[i])!=need2[i])
              dp[j]=0;
      }
      int ans=0;
      for(i=0;i<(1<<n);i++)
         ans+=dp[i],
         ans%=1000000007;
      printf("%d\n",ans%1000000007);
      return 0;
}

AGC017 F - Zigzag的更多相关文章

  1. AtCoder Grand Contest 017 F - Zigzag

    题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...

  2. 【AtCoder】AGC017

    在此处输入标题 标签(空格分隔): 未分类 A - Biscuits dp[i][0/1]表示当前和是偶数还是奇数,直接转移即可 #include <bits/stdc++.h> #def ...

  3. AtCoder Grand Contest 017

    noi前橙名计划失败.全程搞C而gg…… A - Biscuits 题意:背包,求价值为奇/偶的方案数. #include<cstdio> #include<queue> #i ...

  4. Codeforces Round #557 (Div. 1) 简要题解

    Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...

  5. AtCoder Grand Contest 017 (VP)

    contest link Official Editorial 比赛体验--之前做题的时候感觉 AtCoder 挺快的,现在打了VP之后发现还是会挂的--而且不是加载缓慢或者载不出来,直接给你一个无法 ...

  6. Mysql_以案例为基准之查询

    查询数据操作

  7. [LeetCode] ZigZag Converesion 之字型转换字符串

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  8. No.006:ZigZag Conversion

    问题: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  9. leetcode 6. ZigZag Conversion

    https://leetcode.com/problems/zigzag-conversion/ 题目: 将字符串转化成zigzag模式. 例如 "abcdefghijkmlnpq" ...

随机推荐

  1. ZOJ 1203 Swordfish

    题目: There exists a world within our world A world beneath what we call cyberspace. A world protected ...

  2. 淘淘商城学习笔记 之 上传图片到远程服务器,图片的回显出现的bug

    最近在学习淘淘商城中用到的技术,感觉受益良多,遇到一个比较奇怪的bug调了好久,遂心乐之分享于诸君 bug情况是这样的:在商城的后台上传图片之后图片回显不出来,右键查看链接,发现链接被加了localh ...

  3. PhpStorm常用的一些快捷键

    Ctrl + G  :  跳到当前打开文件的行,输入格式(行数:列数)Ctrl + E  : 打开最近编辑的文件列表Ctrl + P  : 显示函数的参数信息Ctrl + Q  : 快速打开函数的说明 ...

  4. 带您了解mysql CONCAT()函数

    CONCAT()函数是mysql中非常重要的函数,可以将多个字符串连接成一个字符串,下文对该函数作了详细的阐述,希望对您有所帮助. mysql CONCAT()函数用于将多个字符串连接成一个字符串,是 ...

  5. 一键批量打印EXCEL、WORD文档

    一键批量打印EXCEL.WORD文档,本方法也可以打印同一个文档N份,可以批量打印A3.A4文档,包括单.双面打印等.希望能帮到广大朋友.请大家注重原创版权,不得在未经许可的下转载.传播,或者用来对同 ...

  6. dedecms列表页有图调用缩略图无图留空的方法

    默认情况下,织梦的文章列表页会调用出当前栏目下的文章列表,并且调用出每个文章的缩略图:如果文章本身就有图,会调用出一张小图,如果没有,则会显示默认的织梦图片.这种处理方式有时候比较影响美观,其实可以修 ...

  7. Python3 的序列

    序列 1.根据列表.元组.字符串的共同点把它们统称为序列(他们都是兄弟呀) 1)都可以通过索引来的到每一个元素 2)默认索引值都是从零开始(Python也支持负数索引) 3)都可以通过分片(切片)的方 ...

  8. 版本控制——TortoiseSVN (4)多版本并行开发 B

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  9. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](七)

    前言 大家好,我依旧是你们的老朋友Rector,很高兴又在周五的时候准时和大家见面. Rector的系列文章[一步一步创建ASP.NET MVC5程序[Repository+Autofac+Autom ...

  10. Mysql Nested-Loop Join Algorithms

    MySQL在多表之间执行join时,利用一种nested-loop algorithm 或者其变种:(嵌套循环)  Nested-Loop Join Algorithm      一个简单的嵌套循环连 ...