hdu 1792 A New Change Problem 剩余系

本文深入解读了一道编程题目的解答过程,重点在于利用组合数学中的余数性质解决实际问题。通过分析题目条件,作者揭示了如何通过最大值和次最优值的组合来求解复杂情况,提供了从理论到实践的完整解析,帮助读者理解并解决类似问题。

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

#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL __int64
int main()
{
    int m,n;
    while(cin>>m>>n)
    {
        cout<<(m-1)*n-m<<" "<<(n-1)*(m-1)/2<<endl;
    }
    return 0;
}


看了三篇这道题的解释,一样的、。不知道谁看谁的。。我还看不太懂,最后只有自己理解了。。有点混乱,凑合着就好

    由于gcd(m,n)=1,所以 0,n,2*n,3*n,...(m-1)*n,对m作除,余数肯定不同,且为{0,1,2,3...m-1}中的某数

    若存在非负数p,q使得pm+qn=x,则x为可组合值,两边对m取余,则(q*n)%m==x%m,p*m>=0,所以只要x比q*n大的数
都能被组合。由于q<m时,就能出现所有余数,所以当x>=(m-1)*n时就必定可组合。
    从(m-1)*n往下寻找,第二大q*n是(m-2)*n=(m-1)*n-n,由于,m,n顺序无关,所以就令m<n.则只要比(m-1)*n-n大的且
不与(m-1)*n同余的数都符合要求。(m-1)*n,(m-1)*n-1,...(m-1)*n-(m-1),都符合要求,只有(m-1)*n-m>(m-2)*n,且同余,
**在m>n的情况下,由于对于q*n相邻m-1个必定不同余,所以结果一样。


    所以最大的不符合数是(m-1)*n-m


    再讨论不符合要求的方案数:
    从大到小讨论q*n。m>n
    对于(m-1)*n,不符合要求的就是,比(m-1)*n小且与它同余的数,就是(m-1)*n-m,(m-1)*n-2*m...
    对于(m-2)*n,不符合要求的就是,(m-2)*n-m,(m-2)*n-2*m...
    。。。
    对于n,不符合要求的就是,n-m...
    所以ans=n/m+(2*n)/m+(3*n)/m...+((m-1)*n)/m=(m-1)*(n-1)/2;(前式除法是取整的,不一定整除)
    why?
    对于n*m/m=n,这个是整除的,所以(i*n+(m-i)*n)/m=n;由于i*n/m必定不整除,所以i*n%m+(m-i)*n%m=m;
因而(i*n)/m+((m-i)*n)/m=n-1,得出:
    ans=n/m+(2*n)/m+...((m-1)*n)/m=(n/m+(m-1)*n/m)+(2*n/m+(m-2)*n/m)+...=(n-1)*(m-1)/2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值