HDU1576 A/B (解法二)【试探法】

问题链接HDU1576A/B

问题简述:参见上述链接。

问题分析之前给出来一个用扩展欧几里德算法解本问题的方法,时间上则比较慢。试探法有时也是高效率的。

根据题意,输入的n=A%9973(没有输入A),A%B=0(A必能被B整除),B与9973互素(GCD(B,9973)=1)。

解题过程首先是建立方程,然后才能编写程序。

设x=(A/B)%9973(x是最终想计算的值,满足0<=x<=9972),则9973k+x=A/B(k为整数),得A=9973Bk+xB。

因为n=A%9973与A=9973Bk+xB,所以xB%9973=n,得xB=n+9973y,亦得xB-n=9973y。

故:(xB-n)%9973=0

对于上式,只需要用试探法就可以求得x。这样,程序运行速度相当快。

需要主意的是,变量类型为long时没有AC,改为long long就AC了,有点奇怪。也许评价系统所用编译版本的long类型不是64位的,才有这种情况。

程序说明:(略)


AC的C语言程序如下:

#include <stdio.h>

int main(void)
{
    int t, i, j;
    long long n, b, a=9973;

    scanf("%d", &t);
    for(i=0; i<t; i++) {
        scanf("%lld%lld", &n, &b);
        for(j=0; j<a; j++)
            if((j * b - n) % a == 0) {
                printf("%d\n", j);
                break;
            }
    }

    return 0;
}


转载于:https://www.cnblogs.com/tigerisland/p/7564916.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值