码迷,mamicode.com
首页 > 移动开发 > 详细

hdu 5698 瞬间移动(排列组合)

时间:2016-07-15 23:47:29      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

  这题刚看完,想了想,没思路,就题解了 = =

  但不得不说,找到这个题解真的很强大,链接:http://blog.csdn.net/qwb492859377/article/details/51478117 

  这个我只是看了他的思路,之后代码就自己写,之后交上去就是1A,我感觉好的题解就应该是这样的,Orz

  要先看下他的思路,现在我在补充些我的理解: 首先,你要把行,列分开看,先说行,从1到n,1和n都不能走,因为1是开始,n是确定的,所以你有n-2种选择,你可以枚举x从1到n-2,就相当于高中学的,在n-2个箱子中放x个相同小球,有几种情况?  同理,列也是,但注意在同一个x时他们还要相乘,这很明显,因为不可能相加。

  最后ans还要加1,因为从1,1直接到n,m的这种情况还没算。还有就是算C(n,k)了,这就是套模板了,没什么说的。

#include <bits/stdc++.h>
using namespace std;

const int INF=0x3f3f3f3f;
typedef long long ll;
#define PI(A) printf("%d\n",A)
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++)
#define reRep(i,a,b) for(int i=(a);i>=(b);i--)
const double EPS= 1e-9 ;

/*  /////////////////////////     C o d i n g  S p a c e     /////////////////////////  */

const int MAXN= 100000 + 5 ;
const int MOD=1e9+7 ;
ll jiech[MAXN];//求阶乘取完模的数组

int N,M;

//快速幂模板
ll mod_pow(ll x,ll n,ll mod)
{
    ll res=1;
    while(n>0){
        if (n&1) res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}

//求C(n,k)的函数 (n在C下面,k在C上面)
//限制:MOD必须是质数,因为是用费马小定理求的
ll C(int n,int k)
{
    ll d=(jiech[k]*jiech[n-k])%MOD;
    return (jiech[n]*mod_pow(d,MOD-2,MOD))%MOD;
}


int main()
{
    //先打表阶乘取模数组
    jiech[1]=jiech[0]=1;
    for (int i=2;i<MAXN;i++)
    {
        jiech[i]=(jiech[i-1]*i)%MOD;
    }

    while(~SII(N,M))
    {
        
        int k=min(N,M);
        int k2=max(N,M);
        ll ans=0;
        //要根据小的那个循环
        for (int i=1;i<=k-2;i++)
        {
            ans+=C(k-2,i)*C(k2-2,i);
            ans%=MOD;
        }
        printf("%lld\n",ans+1);
    }

    return 0;
}

 

hdu 5698 瞬间移动(排列组合)

标签:

原文地址:http://www.cnblogs.com/s1124yy/p/5674683.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!