ABCDEF (ABCDEF.c/cpp/pas)
【题目描述】
LazyChild有n个在[-30000,30000]区间内的整数,他想知道有多少个六元组(a,b,c,d,e,f)满足:
(a × b + c) ÷ d – e = f
【输入文件】
第一行一个整数n。
第二行n个整数。
【输出文件】
一行一个整数,表示有多少个满足要求的六元组。
【样例输入】
2
2 3
【样例输出】
4
【数据规模和约定】
对于30%的数据,1 <= n <= 10
对于100%的数据,1 <= n <= 100
朴素的六重循环。这种问题只要规模不是太大都可以通过hash来将数量级降低一半,否则用于hash计算,或者本处我采用的平衡二叉树所耗的时间将会很大。
但是因为我是个数学弱菜,移项的时候居然忘记考虑0,所以悲剧WA20。除法一定要考虑0呀,傻逼。
这里要注意,使用iterator手动操作map要比map的[]重载快得多得多。
但是还要注意,iterator一定要注意是否等于end()。否则一定会出错!
#include <cstdio>
#include <iostream>
#include <map>
using std::pair;
using std::make_pair;
using std::cout;
using std::map;
typedef long long ll;
ll ans = 0;
map<long,long> hash;
map<long,long>::iterator it1;
long num[110];
inline long getint()
{
long rs=0;bool sgn=1;char tmp;
do tmp = getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp == '-'){tmp=getchar();sgn=0;}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
int main()
{
freopen("ABCDEF.in","r",stdin);
freopen("ABCDEF.out","w",stdout);
long n = getint();
for (long i=1;i<n+1;i++)
num[i] = getint();
for (long i=1;i<n+1;i++)
for (long j=1;j<n+1;j++)
for (long k=1;k<n+1;k++)
{
long tmp = num[i]*num[j]+num[k];
it1 = hash.find(tmp);
if (it1 == hash.end())
hash.insert(make_pair(tmp,1));
else
it1->second ++;
}
for (long k=1;k<n+1;k++)
if (num[k] != 0)
for (long i=1;i<n+1;i++)
for (long j=1;j<n+1;j++)
{
long tmp = (num[i]+num[j])*num[k];
//ans += hash[tmp];
it1 = hash.find(tmp);
if (it1 != hash.end())
ans += it1->second;
}
cout << ans;
return 0;
}