atcode agc 001B题解

题目:atcoder agc 001.

这道题感觉很玄学,感觉好难.

推规律推不出来,最后知道正解才恍然大悟.

首先以题目里的图为例:


我们可以发现,光线会产生几个平行四边形.

我们以f(a,b)表示光线在以a,b为两条不同边的平行四边形中走过的路程.

那么我们就可以得到一个公式:f(a,b)=2*a+f(a,b-a).

那么我们用取模代替减,就可以做到O(log(n))通过这道题.

可是这好麻烦啊.

我们还可以直接调用一个神奇的公式:3*(n-gcd(n,x)).

不要问我怎么来的,我也不知道.

代码如下:

#include<bits/stdc++.h>
  using namespace std;
long long n,x;
inline void into(){
  scanf("%lld%lld",&n,&x);
}
inline void work(){
}
long long gcd(long long a,long long b){
  while (b){
    swap(a,b);
    b%=a;
  }
  return a;
}
inline void outo(){
  printf("%lld\n",3*(n-gcd(n,x)));
}
int main(){
  into();
  work();
  outo();
  return 0;
}

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/80638258
今日推荐