poj 1186poj 1840方程的解数hash+枚举 (n2)

    技术2022-05-20  34

    方程的解数 Time Limit: 15000MS Memory Limit: 128000KTotal Submissions: 4851 Accepted: 1653Case Time Limit: 5000MS

    Description

    已知一个n元高次方程: 其中:x1, x2,...,xn是未知数,k1,k2,...,kn是系数,p1,p2,...pn是指数。且方程中的所有数均为整数。 假设未知数1 <= xi <= M, i=1,,,n,求这个方程的整数解的个数。 1 <= n <= 6;1 <= M <= 150。 方程的整数解的个数小于2 31。 ★本题中,指数Pi(i=1,2,...,n)均为正整数。

    Input

    第1行包含一个整数n。第2行包含一个整数M。第3行到第n+2行,每行包含两个整数,分别表示ki和pi。两个整数之间用一个空格隔开。第3行的数据对应i=1,第n+2行的数据对应i=n。

    Output

    仅一行,包含一个整数,表示方程的整数解的个数。

    Sample Input

    3 150 1 2 -1 2 1 2

    Sample Output

    178 #include<iostream>#include<cstdio>#include<cstring>using namespace std;const int HASHING=10000000;int hash_table[HASHING+1];int hash_num[HASHING+1];int n,m,h;int cnt;struct Node{    int k,p;};Node x[7];int _pow(int x,int i){    if(i==0) return 1;    if(i==1) return x;    int tmp=_pow(x,i/2);    tmp=tmp*tmp;    if(i&1) return tmp*x;    return tmp;}int hash(int x)//创建hash表{    int ret=x;    while(ret<0) ret+=HASHING;    ret=ret%HASHING;    while(hash_table[ret]!=-1&&hash_table[ret]!=x) ret=(ret+1)%HASHING;    hash_table[ret]=x;hash_num[ret]++;    return ret;}int hashok(int x){    int ret=x;    while(ret<0) ret+=HASHING;    ret=ret%HASHING;    while(hash_num[ret])    {        if(hash_table[ret]==x) return hash_num[ret];        ret=(ret+1)%HASHING;    }    return 0;}void dfsl(int step,int val)//创建hash表{    if(step==h) hash(val);    else    {        for(int i=1;i<=m;i++) //枚举xi        {            dfsl(step+1,val+x[step].k*_pow(i,x[step].p));        }    }}void dfsr(int step,int val)//检查val是否已经存在{    if(step==n)// 到n截止    {        cnt+=hashok(-val);//-val 等式右面        return ;    }    for(int i=1;i<=m;i++) dfsr(step+1,val+x[step].k*_pow(i,x[step].p));}void Solve(){    memset(hash_table,-1,sizeof(hash_table));    memset(hash_num,0,sizeof(hash_num));    cnt=0;h=n/2;    dfsl(0,0);    dfsr(h,0);    printf("%d/n",cnt);}int main(){    while(scanf("%d%d",&n,&m)==2)    {        for(int i=0;i<n;i++) scanf("%d%d",&x[i].k,&x[i].p);        if(n==1) printf("%d/n",x[0].k==0?m:0);        else Solve();    }    return 0;} poj 1840: #include<iostream>#include<cstdio>#include<cstring>using namespace std;const int HASHING=1500000;int hash_table[HASHING],vis[HASHING];int hash(int x){    int ret=x;    while(ret<0) ret+=HASHING;    ret%=HASHING;    while(hash_table[ret]!=-1&&hash_table[ret]!=x) ret=(ret+1)%HASHING;    hash_table[ret]=x;vis[ret]++;    return ret;}int hashok(int x){    int ret=x;    while(ret<0) ret+=HASHING;    ret%=HASHING;    while(hash_table[ret]!=-1)    {        if(hash_table[ret]==x) return vis[ret];        ret=(ret+1)%HASHING;    }    return 0;}int a[5];int main(){    while(scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4])==5)    {        memset(hash_table,-1,sizeof(hash_table));        memset(vis,0,sizeof(vis));        for(int i=-50;i<=50;i++)        {            if(i==0) continue;            for(int j=-50;j<=50;j++)            {                if(j==0) continue;                int tmp=a[0]*i*i*i+a[1]*j*j*j;                hash(tmp);            }        }        int cnt=0;        for(int i=-50;i<=50;i++)        {            if(i==0) continue;            for(int j=-50;j<=50;j++)            {                if(j==0) continue;                for(int k=-50;k<=50;k++)                {                    if(k==0) continue;                    int tmp=a[2]*i*i*i+a[3]*j*j*j+a[4]*k*k*k;                    cnt+=hashok(-tmp);                }            }        }        printf("%d/n",cnt);    }    return 0;}

    最新回复(0)