您的位置:首页 > 其它

PKU 1186 hash

2009-10-14 01:53 218 查看
和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
*int(esp+pow(double(k),P
)), 1);

else

Add(K[n-1]*int(esp+pow(double(i),P[n-1]))+K
*int(esp+pow(double(j),P
)), 1);

else

Add(K
*int(esp+pow(double(i),P
)), 1);

}

printf("%d/n",ans);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: