zoukankan      html  css  js  c++  java
  • CF1142A The Beatles

    思路:

    令p表示步数,l表示步长。由于p是使(l * p) % (n * k) == 0的最小的p,所以p = (n * k) / gcd(n * k, l).

    设l = k * x + r,则由题意可知r有四种可能的取值,分别是(a + b) % k, ((-a + b) % k + k) % k, ((a - b) % k + k) % k, ((-a - b) % k + k) % k,枚举各种情况计算即可。

    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const ll INF = 0x3f3f3f3f3f3f3f3f;
     5 ll n, k;
     6 void solve(ll r, ll & minn, ll & maxn)
     7 {
     8     for (int x = r ? 0 : 1; k * x + r <= n * k; x++)
     9     {
    10         ll ans = n * k / __gcd(n * k, k * x + r);
    11         minn = min(minn, ans);
    12         maxn = max(maxn, ans);
    13     }
    14 }
    15 int main()
    16 {
    17     ll a, b;
    18     while (cin >> n >> k >> a >> b)
    19     {
    20         ll minn = INF, maxn = 0;
    21         solve((a + b) % k, minn, maxn);
    22         solve(((-a + b) % k + k) % k, minn, maxn);
    23         solve(((a - b) % k + k) % k, minn, maxn);
    24         solve(((-a - b) % k + k) % k, minn, maxn);
    25         cout << minn << " " << maxn << endl;
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    Comparator
    Compare接口
    Predicate接口和Consumer接口
    Lambda表达式遍历集合
    Lambda表达式入门
    RansomNote
    FirstUniqueCharacterInString
    String All Methods
    形参个数可变的方法(...)
    springBoot excel导出 下载 超简单
  • 原文地址:https://www.cnblogs.com/wangyiming/p/10870774.html
Copyright © 2011-2022 走看看