您的位置:首页 > 其它

HDU-5698-瞬间移动

2016-06-01 18:15 363 查看

Problem Description

有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案,答案对1000000007取模。



Input

多组测试数据。

两个整数n,m(2≤n,m≤100000)

Output

一个整数表示答案

Sample Input

4 5

Sample Output

10

Source

2016”百度之星” - 初赛(Astar Round2B)

Recommend

wange2014

题解

先打印一部分结果,可以发现,斜着看就是杨辉三角的一部分,杨辉三角的规律 :第n行第m个数就是 (a+b)的n次方的第m个多项式的系数。

这里用到卢卡斯定理,套个模板就好。

代码(C)

#include <stdio.h>
#include <string.h>
#define MOD 1000000007
typedef long long LL;

LL quickPower(LL a, LL b)
{
LL ans = 1;
a %= MOD;
while (b)
{
if (b & 1)
{
ans = ans * a %MOD;
}
b >>= 1;
a = a * a % MOD;
}
return ans;
}

LL c(LL n, LL m)
{
if (m > n)
{
return 0;
}
LL ans = 1;
for (int i = 1; i <= m; i++)
{
LL a = (n + i - m) % MOD;
LL b = i % MOD;
ans = ans * (a * quickPower(b, MOD - 2) % MOD) % MOD;
}
return ans;
}

LL lucas(LL n, LL m)
{
if (m == 0)
{
return 1;
}
return c(n % MOD, m % MOD) * lucas(n / MOD, m / MOD) % MOD;
}

int main(int argc, const char * argv[])
{
LL n, m;
while (~scanf("%lld %lld", &n, &m))
{
LL max, min;
max = n + m - 3;
min = m - 1;
printf("%lld\n", lucas(max - 1, min - 1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论 卢卡斯定理