题目: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; }