蓝桥杯:2017年第八届蓝桥杯省赛B组第八题—PREV-36包子凑数


所有包子数的公因数不为1,就会出现有无限多个凑不出来的数。

公因数为1则计算出10000以内有几个凑不出来的。

猜测下最大可能出现的数,可用的包子数越少(最少2);包子数越大(99、100),99x+100y得到一个数,那么为了能达到每隔1个数都能凑出,势必要用到100-99=1。

少用一个100,换用99可以让当前凑出的数-1。

很神奇,那么从一个100开始,99

两个100,198

三个297。。。

什么时候凑出来xxx01呢,当然是9901。

据此推测可能的最大数是9802,最后一个凑不出来的就是9801。

推理完毕!


#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define DPMAX 9802
int gcd(int m,int n)
{
	return m%n?gcd(n,m%n):n;
}
int main(int argc,char **argv)
{
	int cnt,sp[105]={0},isp;
	scanf("%d",&cnt);
	bool dp[DPMAX]={false};
	for(int i=0;i<cnt;i++)
		scanf("%d",&sp[i]);
	isp=sp[0];
	for(int i=1;i<cnt;i++)
		isp=gcd(isp,sp[i]);
	if(isp==1)
	{
		dp[0]=true;
		for(int i=0;i<cnt;i++)
			for(int j=0;j+sp[i]<DPMAX;j++)
				if(dp[j])
					dp[j+sp[i]]=true;
		int ans=0;
		for(int i=0;i<DPMAX;i++)
			if(dp[i]==false)
				ans++;
		printf("%d\n",ans);
	}
	else
		printf("INF\n");
	return EXIT_SUCCESS;
} 

 



事实证明,我的推测是完全正确的,哈哈哈。

END

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值