https://atcoder.jp/contests/agc001/tasks/agc001_b
我经典下标搞不清构造不会写,所以要练练思维题
然后看了下知乎发现stdcall推荐刷agc,然后发现很多牛逼oi选手板刷过agc
打了下agc01
这题我们会发现怎么反射都是60度的,那么同一段连续的反射三角形边长肯定都是一样的了
然后观察样例发现他第一段一定是x,第二段一定是n-x,
接下来就是用短的那一边去填长的那一边,比如样例中a=n-x=3,b=x=2(我们规定a>=b),那么用2次反射高度就减少2,然后接下来就会撞到上边哪条边,上边就是2,然后这个时候三角形的边长就会变成3%2=1,然后2%1==0,我们发现在最后一段会少一段,就直接从p点出去了。
那么这个过程就像一个求gcd辗转相除的过程了,每次三角形的边长都是短边的边长,然后2次反射长度减少一个b,总共就走减少a/b次长度所以这段反射长度是2*b*(a/b),然后最后一次整除的时候减掉1个b就行
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int m,cnt,tot,cas;
ll n,x;ll ans;
int a[maxl];
bool vis[maxl];
char s[maxl];
inline void prework()
{
scanf("%lld%lld",&n,&x);
}
inline void mainwork()
{
ans=n;
ll a=x,b=n-x,t;
while(a>0 && b>0)
{
if(a<b)
swap(a,b);
ans+=2*b*(a/b);
if(a%b==0)
{
ans-=b;
break;
}
t=b;b=a%b;a=t;
}
}
inline void print()
{
printf("%lld\n",ans);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}
本文解析了AtCoder竞赛中AGC001 B题的解题思路及代码实现,介绍了如何通过求最大公约数的方法来解决光线反射路径问题。

被折叠的 条评论
为什么被折叠?



