浙江省赛压轴题 Floor Function

给定a,b,c,d, 满足bc>ad, 求使得cndabn最小的最小的n.

数据规模: 1a,b,c,d1018

y=abx,x=bya, 原问题等价于求cxdy的最小值, axby,x1,y0.

分两种情况考虑

1. ab

k=ab,ykx,c>ad/bkd

a=akb,c=ckd,y=ykx, 此时原问题的约数条件任然满足, 问题可以缩小规模.

原问题的解(x,y)对应现在的解(x,kx+y)

显然若a=0, 我们可以得到(x,y)=(1,0)

2. a<b

k=b1a,x>ky

b=bka,d=dkc,x=xky

类似的, 原问题的约数条件任然满足, 问题可以缩小规模.

显然若d0, 我们可以得到(x,y)=(1,0)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

void solve(LL a, LL b, LL c, LL d, LL &x, LL &y) {
  if (a == 0 || d <= 0) {x = 1, y = 0; return;}
  if (a >= b) {
    LL k = a / b;
    solve(a - k * b, b, c - k * d, d, x, y);
    y += k * x;
  }
  else {
    LL k = (b - 1) / a;
    if (d / c < k) x = 1, y = 0;
    else solve(a, b - k * a, c, d - k * c, x, y);
    x += k * y;
  }
}

int main() {
  int T; scanf("%d", &T);
  for (int _ = 0; _ < T; ++ _) {
    LL a, b, c, d; scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
    LL x, y; solve(a, b, c, d, x, y);
    printf("%lld
", x);
  }
  return 0;
}
View Code
原文地址:https://www.cnblogs.com/BugClearlove/p/4481595.html