hello kity
期待您的批阅,由于写解题报告时 不一定考虑的很周到,所以如果您有什么不懂的地方,请您留言,然而一天之内我肯定会看见您信息,再对代码注释详细,让您更好的阅读
分类
最新评论
最新留言
链接
RSS
计数器
223111
功能
HDU 1496(求多次方程的个数)
spoiler
posted @ 2011年4月16日 03:52
in 未分类
, 1601 阅读
题目意思很好理解,就是求有多少种方程的解的形式,输出来就可以了。
如果用4重循环的话,可能会超时,没有试过。。直接用hash一一对应就可以了。
2重循环把s = a*x1*x1+b*x2*x2 看做一个数组的下标,直接hash[1000000+s]++;
再2重循环把s = c*x3*x3+d*x4*x4 看做下标,开始查找,如果有hash[1000000-s]跟他对应,说明他们两个值加起来等于0,即为方程的解。因为解可正可负,所以最后要乘16(2的四次方)!
代码+部分注释:
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; int a,b,c,d,ans; int s[2000000]; int solve(){ int i,j; if((a>=0&&b>=0&&c>=0&&d>=0)||(a<=0&&b<=0&&c<=0&&d<=0)) return 0; memset(s,0,sizeof(s)); //初始化放在这里 可以避免TLE因为,如果解不合法就没必要 //初始化,7位数的初始化 很可怕的! for(i=1;i<=100;i++) for(j=1;j<=100;j++) s[1000000+(a*i*i+b*j*j)]+=1; for(i=1;i<=100;i++) for(j=1;j<=100;j++) ans+=s[1000000-(c*i*i+d*j*j)]; return 0; } int main(){ while(scanf("%d %d %d %d",&a,&b,&c,&d)!=EOF){ ans=0; solve(); printf("%d\n",ans*16); } return 0; }
2024年1月14日 01:23
Everyone needs a good pair or two of casual shoes for Mens and Walkeaz has you covered with our Best Mens Casual Shoes Collection. Add extraordinary style to your everyday excursions when you wear Best Mens Casual Shoes