2017北京网络赛 Bounce GCD加找规律

题目链接:http://hihocoder.com/problemset/problem/1584

题意:就是求一个小球从矩阵的左上角,跑到矩形的右下角不能重复经过的格子,小球碰到墙壁就反射。

解法:规律题。先算出来小球一共会经过多少网格(包括重复的在内),再算出来有多少个网格过不止一次,两者相减就可以了。对于n*m的矩形,经过观察可以得到,小球弹跳中经过的网格总数是(n-1)*(m-1)/gcd(n-1,m-1)+1,对于9*15的矩形来说就是57。然后来考虑答案39和57的差值,18。对于18有3*6的组合方式,那么对于3可以(9-1)/gcd(9-1,16-1)-1,对于6可以(15-1)/gcd(9-1,15-1)-1.难道是这样凑出来的???套上去发现恰好可以过样例。。然后就没有然后了。

 

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
    LL n,m;
    while(~scanf("%lld%lld",&n,&m)){
        LL ans = (n-1)/__gcd(n-1,m-1)*(m-1)-((n-1)/__gcd(n-1,m-1)-1)*((m-1)/__gcd(n-1,m-1)-1)+1;
        printf("%lld\n", ans);
    }
    return 0;
}

 

对于(n1)×(m1)gcd((n1),(m1))+1

posted @ 2017-09-24 10:34  zxycoder  阅读(306)  评论(0编辑  收藏  举报