例题
AcWing 1205. 买不到的数目
小明开了一家糖果店。
他别出心裁:把水果糖包成4颗一包和7颗一包的两种。
糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。
当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。
大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数 n,m,表示每种包装中糖的颗数。
输出格式
一个正整数,表示最大不能买到的糖数。
数据范围
2≤n,m≤1000,
保证数据一定有解。
输入样例:
4 7
输出样例:
17
思路 :
- 引理 : ∀ a , b \forall a,b ∀a,b,如果 g c d ( a , b ) > 1 gcd(a,b)>1 gcd(a,b)>1,那么不存在不能凑出的最大数
- 结论 : a , b a,b a,b均为 正整数且互质,那么由 a x + b y , x ≥ 0 , y ≥ 0 ax+by,x\geq0,y \geq0 ax+by,x≥0,y≥0不能凑出的最大数为 a b − a − b ab-a-b ab−a−b
- 证明 a b − a − b ab-a-b ab−a−b无法被 a x + b y , x ≥ 0 , y ≥ 0 ax+by,x \geq0,y \geq0 ax+by,x≥0,y≥0表示 :反证法,假设 a b − a − b = a x + b y ab-a-b=ax+by ab−a−b=ax+by,那么 a b = a ( x + 1 ) + b ( y + 1 ) ab=a(x+1)+b(y+1) ab=a(x+1)+b(y+1),由于 a ∣ a b , a ∣ a ( x + 1 ) a|ab,a|a(x+1) a∣ab,a∣a(x+1),因此 a ∣ b ( y + 1 ) a|b(y+1) a∣b(y+1),由于a和b互质,因此, a ∣ y + 1 a|y+1 a∣y+1,由于 y ≥ 0 y \geq0 y≥0,因此 y + 1 ≥ a y+1 \geq a y+1≥a,因此 b ( y + 1 ) ≥ a b b(y+1) \geq ab b(y+1)≥ab,同理, a ( x + 1 ) ≥ a b a(x+1) \geq ab a(x+1)≥ab,因此, a ( x + 1 ) + b ( y + 1 ) ≥ 2 a b ≥ a b a(x+1)+b(y+1) \geq 2ab \geq ab a(x+1)+b(y+1)≥2ab≥ab,矛盾。
- 证明 a b − a − b + d , d ≥ 1 ab-a-b+d,d \geq1 ab−a−b+d,d≥1一定可以表示成 a x + b y , x ≥ 0 , y ≥ 0 ax+by,x \geq0,y \geq 0 ax+by,x≥0,y≥0的形式 :…
#include <iostream>
using namespace std;
int main()
{
int a, b; cin >> a >> b;
cout << a * b - a - b;
}
AcWing 1211. 蚂蚁感冒
长 100 厘米的细长直杆子上有 n 只蚂蚁。
它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有 1 只蚂蚁感冒了。
并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式
第一行输入一个整数 n, 表示蚂蚁的总数。
接着的一行是 n 个用空格分开的整数 Xi, Xi 的绝对值表示蚂蚁离开杆子左边端点的距离。
正值表示头朝右,负值表示头朝左,数据中不会出现 0 值,也不会出现两只蚂蚁占用同一位置。
其中,第一个数据代表的蚂蚁感冒了。
输出格式
输出1个整数,表示最后感冒蚂蚁的数目。
数据范围
1<n<50,
0<|Xi|<100
输入样例1:
3
5 -2 8
输出样例1:
1
输入样例2:
5
-10 8 -20 12 25
输出样例2:
3