步步高升

题目

春节的时候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

思路

首先知道:a*x+b*y=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);
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/81943701
今日推荐