怎样学好哲学(lucas+费马小定理)

Posted Kaiser

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样学好哲学(lucas+费马小定理)相关的知识,希望对你有一定的参考价值。

怎样学习哲学

时间限制: 1 Sec  内存限制: 128 MB
提交: 97  解决: 27
[提交][状态][讨论版]

题目描述

OI大师抖儿在夺得银牌之后,顺利保送pku。这一天,抖儿问长者:“虽然我已经保送了,但是我还要参加学考。马上就要考政治了,请问应该怎样学习哲学,通过政治考试?”
 长者回答:“你啊,Too Young Too Simple,Sometimes Naive!哲学这种东西,不是说想懂就能懂的,需要静心撕烤。你去后面的森林里好好想想。”
长者的后院有一片哲♂学森林。由于一些奥妙重重的原因,这片森林构成了一个n*m的矩形,其中每个点就代表了一棵树。此外,由于辣鸡出题人KJDH从中捣鬼,有些树被连根拔起(也就是消失了)。抖儿每天都要到树下撕烤,因此他想要在每一行选择一棵树。但是他非常讨厌走回头路,因此第i行选择的树必须比第i-1行的靠右。现在抖儿想知道,总共有多少种选择的方案。

输入

第一行三个整数n,m,p,分别表示森林的长、宽,以及消失的树的数目。
接下来p行每行两个整数,表示第ai行第bi列的树消失了。

输出

一行一个整数,表示方案数。由于答案可能很大,请对1000003取模。

样例输入

3 5 2 2 3 3 4

样例输出

5

提示

 

【样例说明】

方案一:选(1,1)(2,2)(3,3)

方案二:选(1,1)(2,2)(3,5)

方案三:选(1,1)(2,4)(3,5)

方案四:选(1,2)(2,4)(3,5)

方案五:选(1,3)(2,4)(3,5)
 
题解,可以将其看成三角形的一个类似的,走法问题,就是半三角形走法,然后就是发现方案数是C(n,m),这个是可以推出来,
然后就是dp,当前节点的方案数总,是它左上部分经过不合法点到达其的方案数之和,相减即为走到该点方案数。
这样可以证明,到该点的方案数是所有,因为任何经过左上的dp[i]方案中,是表示到达dp[i]的合法方案数,因此通过数学归纳法得证,
这个推断是正确的,为了简便,将n+1,m+1这棵树拔掉,然后这个点的方案数,就为结果了。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #define mod 1000003
 7 #define ll long long
 8 #define Q 2007 
 9 using namespace std;
10 
11 int n,m,q;
12 ll p[mod+7],inv[mod+7],dp[Q];
13 struct Node
14 {
15     int x,y;
16 }a[Q];
17 
18 bool cmp(Node x,Node y)
19 {
20     return x.x<y.x;
21 }
22 ll ksm(ll a,ll b)
23 {
24     ll ans=1;
25     while (b)
26     {
27         if (b&1) ans=a*ans%mod;
28         b/=2;
29         a=a*a%mod;
30     }
31     return ans;
32 }
33 ll Lucas_C(int n,int m)
34 {
35     if (n<m) return 0;
36     if (m==0) return 1;
37     if (n==m) return 1;
38     if (n<mod) return p[n]*inv[m]%mod*inv[n-m]%mod;
39     else return Lucas_C(n%mod,m%mod)*Lucas_C(n/mod,m/mod)%mod;
40 }
41 int main()
42 {
43     p[1]=1;
44     for (int i=2;i<=mod;i++)
45         p[i]=(p[i-1]*i)%mod;
46     for (int i=1;i<=mod;i++)
47         inv[i]=ksm(p[i],mod-2);
48     scanf("%d%d%d",&n,&m,&q);
49     
50     for (int i=1;i<=q;i++)
51         scanf("%d%d",&a[i].x,&a[i].y);
52     q++,a[q].x=n+1,a[q].y=m+1;
53     sort(a+1,a+q+1,cmp);
54     for (int i=1;i<=q;i++)
55     {
56         dp[i]=Lucas_C(a[i].y-1,a[i].x-1);
57         for (int j=1;j<i;j++)
58             if (a[i].x>a[j].x&&a[i].y>a[j].y)
59                 dp[i]=(dp[i]-dp[j]*Lucas_C(a[i].y-a[j].y-1,a[i].x-a[j].x-1)%mod+mod)%mod;            
60     }
61     printf("%lld",dp[q]);
62 }

 

以上是关于怎样学好哲学(lucas+费马小定理)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 3037 费马小定理+逆元求组合数+Lucas定理

BZOJ1951SDOI2010古代猪文 Lucas定理中国剩余定理exgcd费马小定理

SDOI 2010--古代猪文(Lucas算法&费马小定理&中国剩余定理)

[bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT

[BZOJ 1951][Sdoi2010]古代猪文(Lucas+CRT+费马小定理)

数学专题