zoukankan      html  css  js  c++  java
  • Hihocoder 1473 小Ho的强迫症 数论 裴蜀定理

      题目链接: http://hihocoder.com/problemset/problem/1473

      题目描述: 有条路上有一个个的格子, 间隔为L, 小HO步伐为D, 脚长为F, 为小HO能否从任意起点出发, 走到无穷远处脚不踩线?

      解题思路: 数论, 设小HO的起点为X, 则需保证小HO脚后跟在前一条线的后面X + KD <= ML, 同时保证小HO前脚在前一条线的后面 X + F + KD <= ML, X肯定>= 0而且, 我肯定保证有一时候是符合条件的啊, 所以不等式1省略, 不等式2转化成F <= KD + ML 这不正是裴蜀定理吗, F = KD + ML 保证有解F是k * gcd(L, D),这里有解就是正好压线, 如果小于等于一倍的gcd不就永远不跨线或者压线吗

      代码: 

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iterator>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <map>
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    #define mem0(a) memset(a,0,sizeof(a))
    #define meminf(a) memset(a,0x3f,sizeof(a))
    typedef long long ll;
    using namespace std;
    
    //const int INF = 0x3fffffff;
    
    int gcd( int a, int b ) {
        return b == 0 ? a : gcd(b, a%b);
    }
    
    int main() {
        int t;
        scanf( "%d", &t );
        while( t-- ) {
            int l, f, d;
            scanf( "%d%d%d", &l, &f, &d );
    //        if( f > l ) {
    //            printf( "NO
    " );
    //            continue;
    //        }
    //        cout << gcd(3, 9) << endl;
            if( f <= gcd(l, d) ) {
                printf( "YES
    " );
            }
            else {
                printf( "NO
    " );
            }
        }
        return 0;
    }
    View Code

      思考: 数论是真的神奇啊, 这种问题是真的容易解决, 不到十行代码就OK了, 所以说好好学数学, 学习高数, 学习组合数学, 下周一有组合数学专讲, 组合数学是真的有用, 像之前杨辉那个会组合绝逼过, 一定打起十二分精神听着! 

  • 相关阅读:
    算法之递归
    初读 c# IL中间语言
    sql语句转为Model
    WPF-悬浮窗(类似于360)
    call,apply
    作用域题目
    css BFC
    数组扁平化 flatten
    常见的异步题
    setTimeout、Promise、Async/Await 的区别
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7372865.html
Copyright © 2011-2022 走看看