P3951 小凯的疑惑 题解

博客园同步

原题链接

简要题意:

给定两种互质的硬币面值,求不能用这两个硬币表示出的面值个数。

本题作为 NOIP   2017 \texttt{NOIP 2017} NOIP 2017 的签到题,有一定的难度。

首先,互质 是一个很重要的条件。

为什么要互质?也就是说, gcd ⁡ ( x , y ) = 1 \gcd(x,y) = 1 gcd(x,y)=1.

众所周知:

a x + b y = k ax + by = k ax+by=k 无解且 k k k 是最大的那个。显然:

a ≤ y − 1 a \leq y-1 ay1

(这是因为, ⌊ a y ⌋ \lfloor \frac{a}{y} \rfloor ya 的部分可以当做 a × b a \times b a×b 的整体被列入 b b b 中)

此时, b ≥ 0 b \geq 0 b0 则显然有解。所以不可以。 b < 0 b<0 b<0

此时, b b b 越大则 k k k 越大,所以取 a = y − 1 , b = − 1 a = y-1 , b=-1 a=y1,b=1.

代入得:

k = ( y − 1 ) x − y = x y − x − y k=(y-1)x - y = xy - x - y k=(y1)xy=xyxy

(原来这么简单)

时间复杂度: O ( 1 ) O(1) O(1).

实际得分: 100 p t s 100pts 100pts.

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
	int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}

int main(){
	int n=read(),m=read();
	printf("%lld\n",1ll*n*m-n-m);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值