ACM136,关于等式

来源:互联网 发布:联想天工网络 编辑:程序博客网 时间:2024/05/16 12:00

题目:

等式

时间限制:1000 ms  |  内存限制:10000 KB
难度:5
描述

有以下等式:a1*x13+a2*x23+a3*x33+a4*x43+a5*x53=0

x1,x2,x3,x4,x5都就在区间[-50,50]之间的整数,且x1,x2,x3,x4,x5都不等于0.

问:给定a1,a2,a3,a4,a5的情况下,x1,x2,x3,x4,x5共有多少种可能的取值?

输入
第一行输入一个整数T(T<=10)表示测试数据的组数。
每组测试数据都只有一行,是5个整数,分表表示a1,a2,a3,a4,a5。(a1,a2,a3,a4,a5都在区间[-50,50]之间)
输出
对于每组数据输出一行,表示x1,x2,x3,x4,x5可能的取值种数
样例输入
137 29 41 43 47
样例输出
654
解题思路:一开始使用五个循环结果电脑直接卡住,由此可以看出这种方法的不可行性。而后采用把五个循环分为两个+3个循环的方式,再用数组存储相应的数。
该思路参考了别人的想法。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define size 25000000
short data[25000000];//50*50^3+50*50^3
int main()
{
int N=0;
printf("请输入测试多少组数据\n");
scanf("%d",&N);
while(N--)
{
int x1=0,x2=0,x3=0,x4=0,x5=0,y=0;
int a1=0,a2=0,a3=0,a4=0,a5=0;
int count=0;

memset(data,0,sizeof(data));
printf("请输入a1,a2,a3,a4,a5\n");
scanf("%d,%d,%d,%d,%d",&a1,&a2,&a3,&a4,&a5);
for(x1=-50;x1<=50;x1++)
{
if(x1==0)
continue;
for(x2=-50;x2<=50;x2++)
{
if(x2==0)
continue;//跳过
y=-1*(a1*x1*x1*x1+a2*x2*x2*x2);
if(y<0)y+=25000000;
data[y]++;//记录每个元素有多少个数
}
}
for(x3=-50;x3<=50;x3++)
{
if(x3==0)
continue;
for(x4=-50;x4<=50;x4++)
{
if(x4==0)
continue;

for(x5=-50;x5<=50;x5++)
{
if(x5==0)
continue;
y=a3*x3*x3*x3+a4*x4*x4*x4+a5*x5*x5*x5;
if(y<0)y+=25000000;
count+=data[y];
}
}
}
printf("有%d种方法\n",count);
}
return 0;
}

0 0
原创粉丝点击