HHUOJ 1022 LCM and Walk(数学规律)

本文解析了一道关于使用最小公倍数进行网格移动的算法题。通过逆向思考,文章详细介绍了如何根据终点坐标确定可能的起始位置数量的方法,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 D: LCM and Walk

时间限制: 1 Sec  内存限制: 128 MB
提交: 4  解决: 2

题目描述

Jerry has just learned some number theory, and can't wait to show his ability to Tom.

Now Jerry is sitting on a grid map of infinite rows and columns. Rows are numbered 1,2,⋯ from the bottom, so are the columns. At first Jerry is standing at grid (sx,sy), and begins his journey.

To show Tom his talents in math, he uses a special way of walk. If currently Jerry is at the grid (x,y), first of all, he will find the minimum z that can be divided by both x and y, and walk exactly z steps to the up, or to the right. So the next possible grid will be (x+z,y), or (x,y+z).

After a finite number of steps (perhaps zero), he finally finishes at grid (ex,ey). However, he is too tired and he forgets the position of his starting grid!

It will be too stupid to check each grid one by one, so please tell Jerry the number of possible starting grids that can reach (ex,ey)!

输入

First line contains an integer T, which indicates the number of test cases.

Every test case contains two integers ex and ey, which is the destination grid.

⋅ 1≤T≤1000.
⋅ 1≤ex,ey≤109.

输出

For every test case, you should output "Case #x: y", where x indicates the case number and counts from 1 and y is the number of possible starting grids.

样例输入

3
6 10
6 8
2 8

样例输出

Case #1: 1
Case #2: 2
Case #3: 3


思路:

规定这样一个运算,它从起点(x,y)出发,每次它会走LCM(x,y)步[LCM(x,y)就是x,y的最小公倍数]到达点(x+LCM(x,y),y)或点(x,y+LCM(x,y)),最终,它会到达点(ex,ey),现给你终点(ex,ey),要你求出它的起点有多少种可能。先顺推,看它走到一个点是怎么走到的。因为两个数一定有最小公倍数,所以不如把最初始的起点的两个数看作因数分解的形式。然后每次都有两种选择,先把它们写出来,会发现:1、每次两个数里面都会有k这个因子;2、还会出现较小的数+1这个因子。所以说,如果(ex,ey)这个点是可以走到的,那么它一定会满足1和2两个性质。所以倒推,每次都判断1、2性质是否成立,如果都成立那么可达,如果不成立就说明到这步就停止了。如果纵坐标比横坐标大,那么一定是纵坐标进行了增加变换,那么你判断完符合1、2性质之后就要把纵坐标除以横坐标+1来进行下一次判断,,如果横坐标比纵坐标大也是这个道理。


代码:

#include<iostream>  
#include<cstdio>  
#include<cstring>  
using namespace std;  
  
int gcd(int a,int b)
{  
    return b?gcd(b,a%b):a;  
}  
  
int main()
{  
   // freopen("in.txt","r",stdin);
    int t,ans=1,x,y;  
    scanf("%d",&t);  
    while(t--)
	{  
        scanf("%d%d",&x,&y);  
        printf("Case #%d: ",ans++);  
        int num=1;  
        int fac = gcd(x,y);  
        while( 1 ){  
            if( x < y ){  
                int m1 = x / fac;  
                int m2 = y / fac;  
                if( m2%(1+m1) == 0 )  
                    num++;  
                else break;  
                y = m2/(1+m1)*fac;  
            }  
            else{  
                int m2 = y / fac;  
                int m1 = x / fac;  
                if( m1%(m2+1) == 0 )  
                    num++;  
                else break;  
                x = m1/(1+m2)*fac;  
            }  
        }  
        printf("%d\n",num);  
    }  
    return 0;  
} 


资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值