PKU 1186 hash

来源:互联网 发布:淘宝网店申请视频教程 编辑:程序博客网 时间:2024/05/16 04:28

和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);
}