首页 > 其他分享 >包子凑数

包子凑数

时间:2024-03-01 21:46:50浏览次数:21  
标签:凑数 gcd int text ++ res 包子 dp

一、题目描述

P8646 [蓝桥杯 2017 省 AB] 包子凑数

二、题目简析

首先,要理解一个定理——裴蜀定理
若任意整数 \(a\) 和 \(b\),且有 \(m = \text{gcd}(a, b)\),对任意整数 \(x\) 和 \(y\),\(ax+by=c\),则 \(m~|~c\)。
由该定理,我们知道 \(ax+by\) 一定是 \(\text{gcd}(a, b)\) 的倍数。

利用裴蜀定理,再来看本题,可以得到两个结论:

  • 1、若 \(\text{gcd}(a, b) == 1\),则无法表达的数目是有限个。
  • 2、若 \(\text{gcd}(a, b) > 1\),则无法表达的数目是无限个。

先判断所有元素的 gcd 是否等于1,若大于,则输出 INF;若等于,则在一定范围内(如 1e5)求出所有可以表示的元素,再统计不能表示的元素个数。我们可以采用动态规划来统计:
令 \(dp[k]=\) 能否表示该数true or false

\[dp[k] = dp[k]~or~dp[k - A[i]] \]

dp[0] = true;
for (int i = 0; i < n; i++)
{
	for (int j = A[i]; j <= N; j++)
		dp[j] = dp[j] | dp[j - A[i]];
}

三、AC代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5;
const int MAX = N + 3;

int A[MAX], n;
bool dp[MAX];

int gcd(int a, int b)
{
	if (b == 0)    return a;
	return gcd(b, a % b);
}

bool check(void)
{
	int res = A[0];
	for (int i = 1; i < n; i++)
		res = gcd(res, A[i]);
	return res == 1;
}

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> A[i];
		
	if (check())
	{
		dp[0] = true;
		for (int i = 0; i < n; i++)
		{
			for (int j = A[i]; j <= N; j++)
				dp[j] = dp[j] | dp[j - A[i]];
		}
		int ans = 0;
		for (int i = 1; i <= N; i++)
			if (!dp[i])
				ans++;
		cout << ans << endl;
	}
	else
		cout << "INF" << endl;	
	
	return 0;	
}

标签:凑数,gcd,int,text,++,res,包子,dp
From: https://www.cnblogs.com/hoyd/p/18048006

相关文章

  • P8646 [蓝桥杯 2017 省 AB] 包子凑数
    根据裴蜀定理可得INF的情况是所有数的最大公约数非1而我们的完全背包的上限是多少呢?设置为Σai即可,因为把每一个ai用上之后的集合,和ai可以重复使用的集合,只差了整数倍个ai,因此可达性是完全一致的,这里N<=100,ai<=100,所以我们把这个背包的上限设置为10000.#include<bits/stdc+......
  • 题解 P2188 小Z的 k 紧凑数
    题目描述小Z在草稿纸上列出了很多数,他觉得相邻两位数字差的绝对值不超过\(k\)的整数特别奇特,称其为\(k\)紧凑数。现在小Z想知道\([l,r]\)内有多少个\(k\)紧凑数,希望你帮帮他。具体思路首先,要求数的个数,自然想到数位dp。然后可以用容斥原理拆询问。\[ans=\sum_{......
  • 包子你好,多多指教
    我也不知道为什么,你的小名叫包子你妈给起的虽然你刚出生10天,我已经通过你学到很多你对这个世界,一无所知比乔布斯的一秒钟变白痴还要厉害,你本来就是你整天都是新手心态第一次喝奶,第一次换尿布,第一次洗澡……你对各种事情都很困惑瞪着个大眼睛,不知道在想什么算了,反正也想不明白还是睡......
  • AcWing——凑数(二进制中1的个数)
    1、题目初始时,n=0。每一轮操作都要依次完成两个步骤:第一步,任选一个非负整数a,将n增加a,这一步所需付出的代价为a。第二步,将n乘以2,这一步无需付出任何代价。你可以不断重复上述操作。给定一个整数x,你的任务是使n在某一步操作后(不一定是某一轮结束后)恰好等于x且付出的总代......
  • 50 循环中跳过某个 5个包子第3个有虫子不吃;胃口不好只吃前三个
    packagecom.fqs.test;importjava.util.Scanner;publicclasshello{publicstaticvoidmain(String[]args){//循环中跳过某个for(inti=1;i<6;i++){if(i==3){//跳过3,继续下个循环continue;......
  • 「杂记」有空吃包子,没空吃肠粉
    写在前面标题是双关。2023.5.14关于《赛马娘PrettyDerby》国服译名《闪耀!优俊少女》的一点个人向考究-为什么不直接采用已是人尽皆知的原名《赛马娘》?首先要谈一下“赛马”和“马术”的区别。“马术”比赛中主要展现的是骑手的技巧和人马协调能力,在保护得当的情况下危险系......
  • 23-5-13--条件控制结构-程序员买包子
     这是一条检测真正程序员的段子:假如你被家人要求下班顺路买十只包子,如果看到卖西瓜的,买一只。那么你会在什么情况下只买一只包子回家?本题要求你考虑这个段子的通用版:假如你被要求下班顺路买 N 只包子,如果看到卖 X 的,买 M 只。那么如果你最后买了 K 只包子回家,说明你看......
  • 4.打包子应用 投票
    接上回最终得到这样的目录mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.pypolls/......
  • 饭菜:蒸包子
    蒸包子    一、和面 1、面粉、温水、酵母、小苏打、糖、盐; 2、和面调料比例:2.1面:水=100g:60g;2.2面:酵母=100g:1g;......
  • leetcode-01背包-416背包子集问题
    因为每一个数字只能用一次,所以可以转化成01背包问题是从0到i-1这个区间内去寻找,时候否选择 nums[i] 是他们的和为 j-nums[i];具体推到如下:状态定义:dp[i][j]表示从数组的......