跳
来源:互联网 发布:软件业务合同 编辑:程序博客网 时间:2024/04/29 15:13
试题描述
输入
输出
输入示例
输出示例
其他说明
思路:
这个题贪心的思路应该比叫好想,因为,越往第一象限深处走,花费的体力越多,所以我们肯定要尽可能多的在坐标轴上走,尽可能少的在象限里走,这样路线就出来了。
关键是如何求这个路线,首先第一部分肯定是max(m,n),然后观察可以发现象限里的每一个点都等于c(x + y,x),这样第二部分的答案就应该是:c(max(m,n) + 0,0) + c(max(m,n) + 1,1) + c(max(m,n) + 2,2) + c(max(m,n) + 3,3) + …… + c(max(m,n) + min(m,n),min(m,n);
根据组合数的的一些性质上式可以合并为c(m + n + 1,min(m,n));
这样我们的答案就变成了max(m,n) + c(m + n + 1,min(m,n));(%1000000007);但是m,n特别大,而且是除法,所以再用费马小定理求个乘法逆元搞一下就好了。
C++程序:
#include <iostream>using namespace std;long long m, n;long long ANS, a, b, x, y, js, js1;long long c = 1000000007, p, ans, ans2;long long zuhe(long long a, long long b){ ans = 1; p = 1; for(long long i = a; i >= max(b, a - b) + 1; --i){ ans = (ans * (i % c)) % c; } for(long long i = 1; i <= min(b, a - b); ++i){ p = (p * (i % c)) % c; } x = p % c; y = c - 2; ans2 = 1; while(y > 0){ if(y % 2 == 1) ans2 = (ans2 * x) % c; y /= 2; x = (x * x) % c; } ans = (ans * ans2) % c; return ans;}int main(){ cin >> m >> n; ANS = max(m, n) % c; a = m + n + 1; b = min(m, n); ANS = (ANS + zuhe(a, b)) % c; cout << ANS;}
0 0
- 跳
- 跳
- 跳~跳~跳
- 我跳我跳我跳跳跳
- 跳跳跳!!
- 跳操
- 眼睛跳
- 青蛙跳
- 跳格子
- 跳 槽
- 青蛙跳
- 跳方格
- 跳格子
- 跳石头
- 跳[Codevs1515]
- 跳石头
- 跳石头
- 跳石板
- poj 1836 Alignment dp
- 51单片机流水灯的三种实现方法
- 计蒜客 难题题库 119 求解a到100的和
- 杭电 3746 Cyclic Nacklace kmp
- Java4Android-接口的应用
- 跳
- python列表排序
- 线段树之POJ3264 Balanced Lineup
- 若对中文编码一次在后台获取会出现中文乱码,编码两次就不会出现乱码
- A1037 Magic Coupon (25)
- 周赛-一道签到题(kmp)
- C/C++ const使用
- 计蒜客 难题题库 120 字符反转
- HDU 1059(Dividing)多重背包