题目:
我们都喜欢 A+B 问题,现在我们遇到了它的一个变形问题,给定 A+B + C = D 的形式,并且规定 A,B,C,D 都是正整数。现在已经知道了 D 的大小, 请问有多少对不同的 (A,B,C) 满足 A + B + C = D,(A,B,C) 与 (A′,B′,C′) 被认为不同当且仅当 A ̸= A′ 或 B ̸= B′ 或 C ̸= C′。 Input 有多组数据,输入开始的第一行是一个整数 T, (T ≤ 100),代表数据组数 z。 接下 T 行,每行一个正整数 D,D ≤ 1000,含义在题面中已经说明。 Output 对于每个 D,输出一行,包含一个整数,代表符合条件的 (A,B,C) 的对数。
Sample Input Sample Output 3 1 4 100
Sample Output 0 3 4851
解答
大佬用一行写出来了代码,数学功底;
发现规律:
假设输入数据为m,则
1 1 m-2; 1 2 m-3; 1 3 m-4…1 m-2 1;
第一个数不变=1,则第二个和第三个之和为m-1,共有m-2种不同;
同理第一个数不变=2,则第二个和第三个之和为m-2,共有m-3种不同;
所以(m-2)+(m-1)+…+1=(m-1)*(m-2)/2,即为答案。
代码如下:
#include<stdio.h>
int main ()
{
int n,m;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
printf("%d\n",(m-1)*(m-2)/2);
}
}
下面为自己写的:
#include<stdio.h>
int main()
{
int t,m,i,j,k,u,count;
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%d",&m);
count=0;
for(k=1;k<m;k++){
for(j=1,u=m-k-j;j+k<m&&u>0;j++){
count++;
}
}
printf("%d\n",count);
}
}
下面这个超时:
#include<stdio.h>
int main()
{
int t,m,i,j,k,u,count;
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%d",&m);
count=0;
for(k=1;k<m;k++){
for(j=1;j+k<m;j++){
if(k+j>=m) break;
for(u=1;u<m;u++){
if(k+j+u==m){
count++;
}
else if(k+j+u>m) break;
}
}
}
printf("%d\n",count);
}
}