步步高升

题目

春节的时候TENSHI去逛花市。她来到一个卖盆竹的摊位,看到一盆叫做“步步高升”的盆竹。“步步高升,步步高升……”学习就是要一步一步来,不能急,要打好基础。在稳固的基础上才谈得上步步高升!TENSHI若有所思。她看到这盆东西好意头,于是想买下。谁知一问价钱,“不贵不贵,才2xxRMB。”TENSHI差点没昏倒,囊中羞涩嘛。但是TENSHI还是很想买下来,于是她就在一旁观察。观察了一段时间,她发现这个卖盆竹的人和别人杀价很有规律。设此人第i次报价为Wi元,那么他第i+1次报的价格为Wi-A或Wi -B。到了最后,TENSHI以Z元成交,高高兴兴的回家去了。
  求TENSHI把盆竹的价格由W1元杀到Z元的方法总数。
吐槽:这杀价真神奇。。。
输入
第一行有两个正整数W1和Z。第二行有两个正整数A和B。它们满足条件:
10 ≤ W1 ≤106,1 ≤ Z ≤ 106 ,Z < W1
2 ≤ A 、B ≤ 10000,A≠B
输出
方法总数
注意:结果不超过MAXLONGINT
##思路
首先知道:ax+by=w-z(x/y为a/b减价的次数)。
直接先w1=w1+z;

for(i=1;i*a<=w1;i++){   //这里求出a可能的个数
    j=w1-i*a;   //b可能的个数
    //接着算他们全排列的个数,累加起来,解决!
}

允许超懒的我一个复制粘贴:
PS:有重复元素的全排列的个数=(x+y)!/x!y!。为了简化代码,可以先简化公式。简化后的公式——(x+y)!/x!*y! = x!(x+1)(x+2)…(x+y)/x!y! = (x+1)(x+2)…(x+y)/y!

代码

#include<cstdio>//表示这里没用iostream库就没打using那个
int main(){
	long long w,z,a,b,i,j,k=0;
	float l;
	scanf("%I64d%I64d%I64d%I64d",&w,&z,&a,&b);
	w=w-z;
	for(i=1;i*a<=w;i++){//i:a可能的个数
		z=w-i*a;  //z:a剩下来的空间
		if(z%b==0){  //如果可以用b塞满
			l=1;
			for(j=1;j<=z/b;j++) //公式不解释
			  l=l*(i+j)/j;
			k+=l;
		}
	}
	printf("%I64d",k);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值