zoukankan      html  css  js  c++  java
  • 试题描述
     
    Robot X喜欢在各种各样空间内跳。
    现在,Robot X来到了一个二维平面。在这个平面内,如果Robot X当前跳到了(x,y),那么他下一步可以选择跳到以下4个点:(x-1,y),(x+1,y),(x,y-1),(x,y+1)。
    而每当Robot X到达一个点,他需要耗费一些体力,假设到达(x,y)需要耗费的体力用 C(x,y)表示。    
    对于C(x,y),有以下几个性质:
    1 、若x=0或者y=0,则C(x,y)=1。
    2 、若x>0且y>0,则C(x,y)=C(x,y-1)+C(x-1,y)。
    3 、若x<0且y<0,则C(x,y)=无穷大。
    现在,Robot X想知道从(0,0)出发到(N,M),最少花费多少体力(到达(0,0)点花费的体力也需要被算入)。   
    由于答案可能很大,只需要输出答案对10^9+7取模的结果。
    输入
    读入两个整数N,M,表示Robot X想到达的点。
    输出
    输出仅一个整数,表示Robot X需要花费的最小体力对10^9+7取模的结果。
    输入示例
    1 2
    输出示例
    6
    其他说明
    对于 100% 的数据,满足    0<=N, M<=10^12   ,N*M<=10^12。

    思路:

            这个题贪心的思路应该比叫好想,因为,越往第一象限深处走,花费的体力越多,所以我们肯定要尽可能多的在坐标轴上走,尽可能少的在象限里走,这样路线就出来了。

            关键是如何求这个路线,首先第一部分肯定是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;
    }
  • 相关阅读:
    javaEE企业级基础介绍(一)
    SQL学习笔记系列(十)窗口函数
    SQL学习笔记系列(九)索引优化分析
    Tableau教程笔记
    淘宝用户行为分析--基于MySQL、Tableau
    Stop thinking,start living--《心灵奇旅》观后感
    SQL刷题
    SQL学习笔记系列(八)流程控制结构
    SQL学习笔记系列(七)存储过程和函数
    在超算系统上使用sbatch提交MXNet分布式训练任务
  • 原文地址:https://www.cnblogs.com/WHYFRANK/p/4717228.html
Copyright © 2011-2022 走看看