Codeforces 559C Gerald and Giant Chess

http://codeforces.com/problemset/problem/559/C

题目大意:给出一个棋盘为h*w,现在要从(1,1)到(h,w),只能向右或向下走,其中有n个黑点不能走,问有多少种方案(模10^9+7)可以从左上角走到右下角(1,1和h,w永远是可以走的)

思路:用dp,首先把终点也算入黑点,然后dp这样:

f[i]=从起点到这个点的所有路径数

f[i]-f[j]*从j点到i点的所有路径数

为什么这样?因为我们先算出总的路径数,再去掉不合法的路径数,也就是:从经过第一个黑点开始到达当前点的所有法案数都是不合法的。还要记得把点排序一下,然后输出终点的dp值就是答案,还要记得预处理一下组合数。

PS:组合数预处理要到20W,因为题目的n,m范围是10W,但是xy相加就会达到20W了

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<iostream>
 6 #define ll long long
 7 const ll Mod=1000000007;
 8 struct node{
 9     int x,y;
10 }p[200009];
11 ll jcny[200009],jc[200009],f[200009];
12 int n,m,K;
13 int read(){
14     int t=0,f=1;char ch=getchar();
15     while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();}
16     while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
17     return t*f;
18 }
19 void exgcd(ll a,ll b,ll &x,ll &y){
20     if (b==0){
21         x=1;
22         y=0;
23         return;
24     }
25     exgcd(b,a%b,x,y);
26     ll t=x;
27     x=y;
28     y=t-(a/b)*y;
29 }
30 void init(){
31     jc[0]=jcny[0]=1;
32     for (int i=1;i<=200005;i++) jc[i]=(jc[i-1]*i)%Mod;
33     ll x,y;
34     exgcd(jc[200005],Mod,x,y);
35     jcny[200005]=(x%Mod+Mod)%Mod;
36     for (int i=200004;i>=1;i--)
37      jcny[i]=(jcny[i+1]*(i+1))%Mod;
38 }
39 bool cmp(node a,node b){
40     return a.x+a.y<b.y+b.x;
41 }
42 ll C(int n,int m){
43     return ((jc[n]*jcny[m]%Mod)*jcny[n-m])%Mod;
44 }
45 int main(){
46     n=read();m=read();K=read();
47     for (int i=1;i<=K;i++){
48         p[i].x=read();p[i].y=read();
49     }
50     K++;
51     p[K].x=n;
52     p[K].y=m;
53     std::sort(p+1,p+1+K,cmp);
54     init();
55     for (int i=1;i<=K;i++){
56         ll res=C(p[i].x+p[i].y-2,p[i].x-1);
57         for (int j=1;j<=K;j++)
58          if (j!=i&&p[j].x<=p[i].x&&p[j].y<=p[i].y)
59           res=((res-(f[j]*C(p[i].x-p[j].x+1+p[i].y-p[j].y+1-2,p[i].x-p[j].x+1-1))%Mod)%Mod+Mod)%Mod;
60         f[i]=res;
61     }
62     printf("%I64d\n",f[K]);
63     return 0;
64 }
时间: 2024-11-03 01:21:09

Codeforces 559C Gerald and Giant Chess的相关文章

CodeForces 540D--E - Gerald and Giant Chess(数论)

给一个棋盘,需要从左上角走到右下角,有部分点不能走,求一共有多少种走法. 首先要知道从一个点A到另一个点B在没有障碍下有多少种走法.保证A在B的左上方,如图 一共需要走(X+Y)步(图中△x,△y),在其中选取X步走横向,Y步走竖向.所以一共有C(x+y, x)种走法. 把所有不能走的点排好序,对于每个点求出原点到该点的走法减去所有需要经过黑点的路径就是到该点的走法. #include <bits/stdc++.h> using namespace std; typedef long long

CF 559C - Gerald and Giant Chess (组合计数)

\(C_{x+y}^y\)的公式,DP容斥删多余贡献. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a)) #define nR(a,b,c) for(register int a

CF559C Gerald and Giant Chess

题意 C. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Giant chess is quite common in Geraldion. We will not delve into the rules of the game, we'll just say that the

Gerald and Giant Chess

(Gerald and Giant Chess )[https://www.luogu.org/problemnew/show/CF559C] 给你一个\(n\times m\)的网格图,有t个棋子被标记成黑色,第i个黑色格子记做\((x_i,y_i)\),其余白色,现在询问在只能向下走或向右走的前提下,从\((1,1)\)到\((n,m)\)的不经过黑色格子的路径条数,\(n,m\leq 10^5,p\leq 2000\). 解 显然不会以传统做法,在哪一个格子为状态,突破点在只有2000个黑

codeforce 559 C Gerald and Giant Chess

题意大概就是从左上角走到右下角只能往下或往右走,黑色格子不能走,问有多少种走法. 这个要是知道对于没有黑色格子的时候,走到r行,c列的走法是C(r+c-2,r-1)的话就很容易了. 考虑到黑色格子数目较少,dp[i]:走到第i个黑色格子的走法 #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath&g

Codeforces Round #313 (Div. 1) C. Gerald and Giant Chess

这场CF又掉分了... 这题题意大概就给一个h*w的棋盘,中间有一些黑格子不能走,问只能向右或者向下走的情况下,从左上到右下有多少种方案. 开个sum数组,sum[i]表示走到第i个黑点但是不经过其他黑点的方案数. 式子是sum[i]=c(x[i]+y[i],x[i])-Σ(sum[j]*c(x[i]-x[j]+y[i]-y[j],x[i]-x[j])). c(x+y,x)表示从格子(1,1)到(x,y)的方案数(没有黑点). 因此每个点按x[i]+y[i]的值排个序,然后n^2弄一下他们的拓扑

CF 560e Gerald and Giant Chess

题意:在h×w的棋盘中从左上角走到右下角,只能向右或向下走,有n个点不可以经过,一共有多少种方案. 解法:dp.先对点按横坐标排序(横坐标相等按纵坐标,也可以反过来)dp[i]表示不经过其他非法点走到第i个非法点的路径数,则有dp方程:dp[i] = c(point[i].x + point[i].y - 2, point[i].x - 1) - Σj = 0...i - 1 dp[j] * c(point[i].x - point[j].x + point[i].y - point[j].y,

组合数取模 Gym100947E || codeforces 559c

E - Qwerty78 Trip Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice Gym 100947E Description standard input/output Announcement Statements Qwerty78 is a well known programmer (He is a member of the ICP

codeforces 559A(Gerald&#39;s Hexagon)

Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Gerald got a very curious hexagon for his birthday. The boy found out that all the angles of the hexagon are equal to . Then he measured the length of its sides