题意:
给你一个n*m的棋盘, 起初一个弹珠从棋盘左上角开始朝右下方45°方向弹射,遇到墙之后转向90°。遇到拐角停止。
问最后小球停止后,只经过一次的网格有多少个。
题解:
只经过一次的网格数=路径长度-走过两次的方格数*2;
路径长度= lcm(n-1,m-1);
走过两次的方格数=[(n-1)/gcd(n-1,m-1)-1][(m-1)/gcd(n-1,m-1)-1]/2;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n,m;
while(~scanf("%lld %lld",&n,&m)){
ll t=__gcd(n-1,m-1);
ll ans1=(n-1)*(m-1)/t+1;
ll ans2=(n-1)/t-1;
ll ans3=(m-1)/t-1;
printf("%lld\n",ans1-ans2*ans3);
}
return 0;
}