和2785是一样的,稍微不同n是可变的1<=n<=6
这里用递归来处理n代码会比较好,当时觉得6只是6枚举一下情况就好了
所以没用递归,而是枚举情况写出的代码比较繁琐
本可以1Y,没注意内存显示,开了两个int [20000000],MLE,改成15000000就AC了
代码如下
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define esp 1e-5
#define BIGNUM 15000000 // 20000000就MLE了
#define INF 2147483647
int K[7],P[7];
int ans;
int hash[BIGNUM],s[BIGNUM];
int HASH(int h)
{
h%=BIGNUM;
if (h<0) h+=BIGNUM;
return h;
}
void Add(int num,bool flag)
{
if (flag) num = -num;
int h = HASH(num);
while(hash[h]!=INF && hash[h]!=num)
h=(h+1)%BIGNUM;
if (flag)
ans += s[h];
else
hash[h] = num , s[h]++;
}
int main()
{
int n,m; scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d%d",&K[i],&P[i]);
if (n==1)
{
printf("0/n");
return 0;
}
fill_n(hash,BIGNUM,INF);
for (int i=1;i<=m;i++)
{
if (n>=4)
for (int j=1;j<=m;j++) // 可以递归处理,达到深度n/2停止,这里没用递归,写得比较多
if (n>=6)
for (int k=1;k<=m;k++)
Add(K[1]*int(esp+pow(double(i),P[1]))+K[2]*int(esp+pow(double(j),P[2]))+K[3]*int(esp+pow(double(k),P[3])), 0);
else
Add(K[1]*int(esp+pow(double(i),P[1]))+K[2]*int(esp+pow(double(j),P[2])), 0);
else
Add(K[1]*int(esp+pow(double(i),P[1])), 0);
}
for (int i=1;i<=m;i++)
{
if (n>=3)
for (int j=1;j<=m;j++)
if (n>=5)
for (int k=1;k<=m;k++)
Add(K[n-2]*int(esp+pow(double(i),P[n-2]))+K[n-1]*int(esp+pow(double(j),P[n-1]))+K[n]*int(esp+pow(double(k),P[n])), 1);
else
Add(K[n-1]*int(esp+pow(double(i),P[n-1]))+K[n]*int(esp+pow(double(j),P[n])), 1);
else
Add(K[n]*int(esp+pow(double(i),P[n])), 1);
}
printf("%d/n",ans);
}