hdu 1792 A New Change Problem(互质数之间最大不能组合数和不能组合数的个数)

 

 

 

题意:求互质的m和n的最大不能组合数和不能组合数的个数

思路:m和n的最大不能组合数为m*n-m-n,不能组合数的个数为(m-1)*(n-1)/2

推导:

  先讨论最大不能组合数

  因为gcd(m,n)=1,所以 0,n,2*n,3*n,...(m-1)*n(共m个数字)分别除以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,x都能被组合出来。当q<m时,能出现所有余数,所以当x>=(m-1)*n时,x必定可被组合。

  从(m-1)*n往下寻找,第二大的q*n为(m-2)*n=(m-1)*n-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,即m*n-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    

  对于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

标准程序

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int m,n;
 6     while(cin>>m>>n)
 7     {
 8         cout<<m*n-m-n<<" "<<(m-1)*(n-1)/2<<endl;
 9     }
10     return 0;
11 } 

 

转载于:https://www.cnblogs.com/DestinHistoire/p/10632970.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值