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

10077 단어 codeforces
C. Gerald and Giant Chess
Time Limit: 20 Sec
Memory Limit: 256 MB
제목 연결
http://codeforces.com/contest/559/problem/C
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, and found that each of them is equal to an integer number of centimeters. There the properties of the hexagon ended and Gerald decided to draw on it.
He painted a few lines, parallel to the sides of the hexagon. The lines split the hexagon into regular triangles with sides of 1 centimeter. Now Gerald wonders how many triangles he has got. But there were so many of them that Gerald lost the track of his counting. Help the boy count the triangles.
Input
The first line of the input contains three integers: h, w, n — the sides of the board and the number of black cells (1 ≤ h, w ≤ 105, 1 ≤ n ≤ 2000).
Next n lines contain the description of black cells. The i-th of these lines contains numbers ri, ci (1 ≤ ri ≤ h, 1 ≤ ci ≤ w) — the number of the row and column of the i-th cell.
It is guaranteed that the upper left and lower right cell are white and all cells in the description are distinct.
Output
Print a single line — the remainder of the number of ways to move Gerald's pawn from the upper left to the lower right corner modulo109 + 7.
Sample Input
3 4 22 22 3
Sample Output
2
HINT
 
제목
n * m 의 그림 은 왼쪽 상단 에서 오른쪽 하단 까지 걸 어가 게 합 니 다. 약간 지나 갈 수 없 는 방법 이 있 습 니 다. 몇 가지 방법 이 있 는 지 물 어보 세 요.
문제 풀이:
dp [i] 검 은 점 을 거치 지 않 는 방안 수 를 표시 합 니 다.
fi=Cxixi+yi−∑(xj<=xi,yj<=yi)C(xi−xj)(xi−xj)+(yi−yj)∗fj 
그리고 뛰 어 다 녔 으 면 좋 겠 어 요.
http://blog.csdn.net/popoqqq/article/details/46121519
코드
 
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define test freopen("test.txt","r",stdin)
#define maxn 1010000
#define M 10000
#define mod 1000000007
#define eps 1e-9
const int inf=0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fLL;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
//**************************************************************************************

struct Point
{
    long long x,y;
}points[5000];
bool cmp(Point a,Point b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
ll p=mod;
ll fac[maxn];
ll qpow(ll a,ll b)
{
    ll ans=1;a%=mod;
    for(ll i=b;i;i>>=1,a=a*a%mod)
        if(i&1)ans=ans*a%mod;
    return ans;
}
ll C(ll n,ll m)
{
    if(m>n||m<0)return 0;
    ll s1=fac[n],s2=fac[n-m]*fac[m]%mod;
    return s1*qpow(s2,mod-2)%mod;
}
ll f[maxn];
int main()
{
    fac[0]=1;
    for(int i=1;i<maxn;i++)
        fac[i]=fac[i-1]*i%mod;
    int n=read(),m=read(),k=read();
    for(int i=1;i<=k;i++)
    {
        points[i].x=read();
        points[i].y=read();
        points[i].x-=1;
        points[i].y-=1;
    }
    points[++k].x=n-1;
    points[k].y=m-1;
    sort(points+1,points+k+1,cmp);
    for(int i=1;i<=k;i++)
    {
        f[i]=C(points[i].x+points[i].y,points[i].x);
        for(int j=1;j<i;j++)
        {
            if(points[j].y<=points[i].y)
            {
                f[i]+=(p-f[j]*C(points[i].x-points[j].x+points[i].y-points[j].y,points[i].x-points[j].x)%p);
                f[i]%=p;
            }
        }
    }
    cout<<f[k]%p<<endl;
}

 
 

좋은 웹페이지 즐겨찾기