0
点赞
收藏
分享

微信扫一扫

蓝桥杯C++ AB组辅导课 第三讲 数学与简单DP Acwing

九月的栩 2022-02-05 阅读 70

例题

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,x0,y0不能凑出的最大数为 a b − a − b ab-a-b abab
  • 证明 a b − a − b ab-a-b abab无法被 a x + b y , x ≥ 0 , y ≥ 0 ax+by,x \geq0,y \geq0 ax+by,x0,y0表示 :反证法,假设 a b − a − b = a x + b y ab-a-b=ax+by abab=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) aab,aa(x+1),因此 a ∣ b ( y + 1 ) a|b(y+1) ab(y+1),由于a和b互质,因此, a ∣ y + 1 a|y+1 ay+1,由于 y ≥ 0 y \geq0 y0,因此 y + 1 ≥ a y+1 \geq a y+1a,因此 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)2abab,矛盾。
  • 证明 a b − a − b + d , d ≥ 1 ab-a-b+d,d \geq1 abab+d,d1一定可以表示成 a x + b y , x ≥ 0 , y ≥ 0 ax+by,x \geq0,y \geq 0 ax+by,x0,y0的形式 :…
#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

AcWing 1216. 饮料换购

AcWing 2. 01背包问题

AcWing 1015. 摘花生

AcWing 895. 最长上升子序列

习题

AcWing 1212. 地宫取宝

AcWing 1214. 波动数列

举报

相关推荐

0 条评论