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; }
相关文章推荐
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- Project Euler Problem 387 - Harshad Numbers - 深度优先
- 编程之美2015初赛A
- 数论题集
- 原根
- 阶与原根学习笔记
- HDU 1299 Diophantus of Alexandria
- Leftmost Digit(HDU 1060)
- Rightmost Digit(HDU 1061)
- Python-在奇数中寻找素数
- ZOJ 2674 Strange Limit 欧拉定理
- LeetCode-Palindrome Number
- 组合数求模总结
- Sicily 1047 Super Snooker
- 【数论】组合数求模