Hopscotch(组合数计算)

题目链接:http://exam.upc.edu.cn/problem.php?id=5095

题目大意:给你一个N    ,    X    ,    Y--n的距离从(0   ,    0)->(n    ,    n)   

且每一步都不能走的路程沿X轴方向不能小于X,    沿Y轴方向不小于Y。

问题是:问有多少种方法能走到终点。(n,n)


题解:

首先我们可以确定的是    一步走过去吧。

而第二步是    确定前后的距离    之间的都可以

举例子(n=7,    x=2)

 0       1        2        3        4        5        6        7    

 ×    ×      @      @      @       @      ×      ×

('X'    是两步时不能走的区域,       '@'    是可以走的区域)。

所以对于    N=7,且    X  =  2    走两步的情况有4种

              同理可得        Y  =  3    走两步的情况有2种

所以示例中所给的N=7,X=2,Y=3

ans=        1            +        2×4    =    9;

             (一步)                 (两步)

可以看出来,答案应该是对应的步数是的方案数相乘最后就累加起来,

for(    1    ~    min(N/X,N/Y))

        ans    +=(X[  i  ]    *    Y[  i  ])

至于在第几步中对于它的方案数怎么求呢?

若该数是21 ,x为3或4    

表如下:

步数  1        2           3          4           5

3     1      16          91      220         210

4        1      14          55         56          5

1      
1      1      
1      2      1      
1      3      3      1      
1      4      6      4      1      
1      5      10     10     5      1      
1      6      15     20     15     6      1      
1      7      21     35     35     21     7      1      
1      8      28     56     70     56     28     8      1      
1      9      36     84     126    126    84     36     9      1      
1      10     45     120    210    252    210    120    45     10     1      
1      11     55     165    330    462    462    330    165    55     11     1      
1      12     66     220    495    792    924    792    495    220    66     12     1      
1      13     78     286    715    1287   1716   1716   1287   715    286    78     13     1      
1      14     91     364    1001   2002   3003   3432   3003   2002   1001   364    91     14     1      
1      15     105    455    1365   3003   5005   6435   6435   5005   3003   1365   455    105    15     1      
1      16     120    560    1820   4368   8008   11440  12870  11440  8008   4368   1820   560    120    16     1      
1      17     136    680    2380   6188   12376  19448  24310  24310  19448  12376  6188   2380   680    136    17     1      
    18     153    816    3060   8568   18564  31824  43758  48620  43758  31824  18564  8568   3060   816    153    18     1      
1      19     171    969    3876   11628  27132  50388  75582  92378  92378  75582  50388  27132  11628  3876   969    171    19     1      
1      20     190    1140   4845   15504  38760  77520  125970 167960 184756 167960 125970 77520  38760  15504  4845   1140   190    20     1      

X|Y [  i  ]    =    C(    n -  (x-1)*i  -  1     ,    i-1   );


https://www.cnblogs.com/sciorz/p/8904234.html

http://www.cnblogs.com/lemon-jade/p/8909462.html

#include
using namespace std;
typedef long long ll;
const ll MAXN = 1e6+7,mod=1e9+7;
ll fac[MAXN+100],inv[MAXN+100];
ll qpow(ll a,ll b){ll ans=1;while(b){if(b&1){ans=(ans*a)%mod;}a=(a*a)%mod;b>>=1;}return ans;
}
void init()
{fac[0]=1;for (int i=1; i< MAXN ; i++){fac[i] = (fac[i-1] * i )% mod;}inv[MAXN-1]=qpow(fac[MAXN-1],mod-2);for(int i=MAXN-2;i>=0;i--){inv[i]=inv[i+1]*(i+1)%mod;}
}
ll C(ll n, ll m)
{if ( n








本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部