第一次竞赛-B.连接竹竿

B-连接竹竿 

Alice从市场上买了N根竹竿,每根竹竿都以“节”为单位。这些竹竿中最短的有A节,最长的有B节,其余竹竿各有长短,每根竿的节数也必定在[A,B]范围内。现在Alice希望将这些竹竿用连接部件全部接成一根长竹竿。连接部件的长度忽略不计,请你输出连接后的长竹竿共可能有多少种不同节数。
数据不合理或组合不出结果时输出0

数据范围

 

  • 1 ≤ N,A,B ≤ 10^9
  • A 和 B 都是整数.

输入形式

输入一行,如下形式的标准输入:

N A B

输出形式

输出最终接成竹竿长度的种数.

输入样例1

4 4 6

输出样例1

5

有4根竹竿,最短的有4节,最长的6节。这时将竹竿可能组合出如下5种不同节数: 18=4+4+4+6, 19=4+4+5+6, 20=4+5+5+6, 21=4+5+6+6 and 22=4+6+6+6,所以应当输出 5

输入样例2

5 4 3

输出样例2

0

输入样例3

1 7 10

输出样例3

0

输入样例4

1 3 3

输出样例4

1
#include<stdio.h>

int main()
{
   int n,a,b;
   scanf("%d %d %d",&n,&a,&b);
   int min=a * ( n - 1 ) + b ;
   int max = a + ( n - 1 ) * b;
   if(n == 1 ){
       if( a == b)
           printf("1");
        else
            printf("0");
   } 
   else{
       if(a > b ) 
         printf("0");
       else
         printf("%lld",(long long)max - min + 1);
   
   }
    return 0;
}
    

上述代码有一个测试点过不去,不知道哪里出了问题。

题解:

题面虽然说是长度的组合,但实际并不需要计算组合数。抽象成数学表述就是,当N>1的情形,有N个整数,这N个整数均属于区间[A,B],那么这N个数的和的最小可能是A+A+...+A+B=(N-1)A+B,最大可能是A+B+B+...+B=A+(N-1)B.而除了A和B不能变,其它的整数数值不知道,我们总可以调整其中的一个数字+1而使总和+1,这就说明在最小值(N-1)A+B到最大值A+(N-1)B之间的每个数都可能是这N个数的和,所以要计算的结果就是[(N-1)A+B,A+(N-1)B]之间整数的个数,即((N-1)B+A)+1-((N-1)A+B)=(B-A)(N-2)+1
其它情况N=1时A=B就输出1,此时只能拼成长为A+B的竹竿.其它如A>B,或N=1时A不等于B,均输出0

#include<stdio.h>

int main()
{
   int n,a,b;
   scanf("%d %d %d",&n,&a,&b);
   if(n == 1 ){
       if( a == b)
           printf("1");
        else
            printf("0");
   } 
   else{
       if(a > b ) 
         printf("0");
       else
         printf("%lld",(long long)(b-a)*(n-2)+1);
   
   }
    return 0;
}
    

猜你喜欢

转载自blog.csdn.net/qq_37503890/article/details/86546276