题目
春节的时候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);
}