画山 paint

有一张大小为n*m的白纸,小R想在纸上画一片绵延的群山。

为了描述方便,我们将纸张表示在坐标系上,四个顶点的坐标分别为(0,0),(n,0),(0,m),(n,m)。

小R有一只神奇的画笔,能画p种不同的线段,每种线段用两个参数a,b表示,若画笔停留的位置为(x,y),则能画一条从(x,y)到(x+a,y+b)的线段,然后画笔停留在(x+a,y+b),每种线段能画任意次。

小R需要从(0,0)开始,在(n,0)结束,在不超过纸张大小的范围内(可以在边界上)画一片绵延的群山。求一共有多少种本质不同的山形(亦即我们不认为画两次(1,1)和画一次(2,2)有任何区别)。由于结果可能会很大,你只需输出对1,000,000,007取模后的值。

【数据范围】

对于40%的数据,n,m,p≤10

对于100%的数据,n,m,p≤100,1≤ai≤10,-10≤bi≤10


这数据范围看着就很佛系

先把斜率相同的画笔归类,处理处该画笔可以画多少不同的长度。

可以令f[x][y][i]表示画到(x,y),最后一次用的笔种类是i的方案数

再记s[x][y]表示画到(x,y)总方案数

转移的时候取两个差值,避免同一种笔画两次就行。

 #include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define mod 1000000007
#define ll long long
using namespace std;
int n,m,p,flag[][],tot,sum[],id[][];
ll f[][][],S[][];
struct node{
int x,y;double k;
}s[],a[];
bool cmp(node a,node b){return a.k<b.k;}
bool pd(int x,int y){
if(x>=&&x<=n&&y>=&&y<=m)return ;
return ;
}
int gcd(int x,int y){
if(!y)return x;
return gcd(y,x%y);
}
int main(){
cin>>n>>m>>p;
for(int i=;i<=p;i++){
scanf("%d%d",&s[i].x,&s[i].y);
s[i].k=(double)s[i].y/s[i].x;
}
for(int i=;i<=p;i++){
int g=gcd(s[i].x,abs(s[i].y));
s[i].x/=g;s[i].y/=g;
int nx=s[i].x+,ny=s[i].y+;
if(!id[nx][ny])id[nx][ny]=++tot,a[tot].x=s[i].x,a[tot].y=s[i].y;
int t=id[nx][ny];
flag[t][]=;
for (int l=g;l*s[i].x<=n;l++)
flag[t][l]|=flag[t][l-g];
} S[][]=;
for(int x=;x<=n;x++)
for(int y=;y<=m;y++){
for(int i=;i<=tot;i++){
for(int j=;j<=n;j++){
int nx=x-a[i].x*j,ny=y-a[i].y*j;
if(nx>= && nx<=n && ny>= && ny<=m){
//cxout<<nx<<' '<<ny<<' '<<f[x][y][i]<<endl;
if(flag[i][j])f[x][y][i]=(f[x][y][i]+S[nx][ny]-f[nx][ny][i])%mod;
}
else break;
}
S[x][y]+=f[x][y][i];S[x][y]%=mod;
} }
cout<<S[n][]<<endl;
return ;
}

画山 paint的更多相关文章

  1. 【ZJ选讲·画山】

    给出一张纸(N × M),你要在上面画山,但不能画出界(N,M<=100) Like this: 起点为(0,0),终点为(N,0) 给出w种线段画法(x,y),表示用了这种画法后,笔迹末 ...

  2. noip2018 pre——Dp

    Dp专题 1011: KC的瓷器 (porcelain) 题目描述 KC来到了一个盛产瓷器的国度.他来到了一位商人的店铺.在这个店铺中,KC看到了一个有n(1<=n<=100)排的柜子,每 ...

  3. 画年利率 画图 自定义 View

    使用 SlbSyView slbView; slbView = (SlbSyView) findViewById(R.id.slbView); slbView.setHeights(new float ...

  4. 图形绘制 Canvas Paint Path 详解

    图形绘制简介        Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...

  5. Android使用学习之画图(Canvas,Paint)与手势感应及其应用(乒乓球小游戏)

    作为一个没有学习Android的菜鸟,近期一直在工作之外努力地学习的Android的使用. 这周看了下Android的画图.主要是Canvas,Paint等,感觉须要实践下.下午正好有空,就想整一个乒 ...

  6. Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解

    上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定 ...

  7. 画布Canvas 画笔Paint

    package com.example.m_evolution.View; import android.content.Context; import android.graphics.Canvas ...

  8. Android教程:在百度地图上画出轨迹

    [日期:2013-04-14] 来源:Linux社区  作者:crazyxin1988 [字体:大 中 小]     接着上面的项目<Android访问webservice.客户端登录注册> ...

  9. Path画直线与弧线

    代码地址如下:http://www.demodashi.com/demo/14754.html 前言 之前讲过Paint和Canvas的基本使用,今天来介绍下Path的使用 涉及内容有: Path画直 ...

随机推荐

  1. Cisco基础(六):配置目前网络环境、项目阶段练习

    一.配置目前网络环境 目标: 一家新创建的IT公司,公司位于北京有80多台服务器 目前网络环境使用技术,通过端口映射技术将web服务器发布给Internet: 三层交换:汇聚接入层交换机 默认路由:实 ...

  2. Linux系统之-介绍,主要特性

    Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议.它支持32位 ...

  3. 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:匹配代价计算之互信息(Mutual Information,MI)

      半全局立体匹配算法Semi-Global Matching,SGM由学者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况 ...

  4. 前端每日实战:58# 视频演示如何用纯 CSS 创作一只卡通鹦鹉

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vrRmWy 可交互视频 此视频是可 ...

  5. Myeclipse下使用Maven搭建spring boot2.0项目

    现在需要搭建spring boot框架,并实现一个HelloWorld的项目,让程序真正运行起来. 一.在pom.xml中引入spring-boot-start-parent,spring官方的叫st ...

  6. Vue的安装和使用详解(一)

    Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便于与 ...

  7. 尚学linux课程---12、vim操作命令2

    尚学linux课程---12.vim操作命令2 一.总结 一句话总结: 要看不同的视频,每个视频的关键点都不一样,不如之间的的视频就没讲到vim中set nu是什么意思 学了的内容一定要练,不然真的是 ...

  8. (6)C++ 函数

    一.基本知识  1.为什么需要原型? 原型描述了函数到编译器的接口,将函数返回值类型以及参数类型.参数数量告诉编译器. 首先原型告诉编译器方法存在某些参数,如果没有原型会让编译器捕获这种错误. 其次函 ...

  9. 6、基于highcharts实现的线性拟合,计算部分在java中实现,画的是正态概率图

    1.坐标点类 package cn.test.domain; public class Point { double x; double y; public Point(){ } public Poi ...

  10. jsp中jstl、el使用

    tomcat7.0+JSTL1.1.2(不冲突) EL表达式获取变量 ${表达式} 如:${user.name} 不可以动态取值 ${user[name]}可以动态取值,变量名中含有特殊字符时只能用此 ...