POJ 1186 方程的解數

方程的解數
Time Limit: 15000MS   Memory Limit: 128000K
Total Submissions: 6188   Accepted: 2127
Case Time Limit: 5000MS

Descriptionspa

已知一個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)均爲正整數。 

Inputcode

第1行包含一個整數n。第2行包含一個整數M。第3行到第n+2行,每行包含兩個整數,分別表示ki和pi。兩個整數之間用一個空格隔開。第3行的數據對應i=1,第n+2行的數據對應i=n。

Outputblog

僅一行,包含一個整數,表示方程的整數解的個數。

Sample Inputip

3
150
1  2
-1  2
1  2

Sample Outputhash

178
#include<stdio.h> 
#include<stdlib.h>  
#define Max 4000037  
int hash[Max],num[Max];  
//hash判斷和的位置,num是和爲s的個數 bool used[Max];            
bool used[Max];
//判斷hash是否用過 
int n,M,k[7],p[7],cnt,mid;   
int locat(int s) 
{  
    int tmp=s; 
    while(tmp<0) 
    {
        tmp+=Max;  
    }
    while(tmp>=Max)  
    {
        tmp-=Max;  
    }
    while(used[tmp]&&hash[tmp]!=s)  
    {   
        tmp++;   
        if(tmp>=Max)  
        {
            tmp-=Max;  
        }
    } 
    return tmp;
}  

void in_sert(int s)
{  
    int pos=locat(s);  
    hash[pos]=s; 
    used[pos]=1; 
    num[pos]++; 
}   
void left_dfs(int d,int s)          //左邊一半的值的和的可能 
{  
    if(d==mid)  
    {   
        in_sert(s);  
        return  ;
    }  
    for(int i=1;i<=M;i++)  
    { 
        int tmp=k[d];   
        if(i!=1&&tmp!=0)   
        {    
            for(int j=0;j<p[d];j++)   
            {
                tmp*=i;  
            }
        }   
        left_dfs(d+1,s+tmp); 
    }
}  

void right_dfs(int d,int s)        //右邊全部和的可能若是左右相等,那麼就加上這個和的全部可能 
{  
    if(d==n)  
    {   
        s=-s;  
        int pos=locat(s);  
        if(hash[pos]==s) 
        {
            cnt+=num[pos];
        }
        return ;  
    }  
    for(int i=1;i<=M;i++) 
    {   
        int tmp=k[d];  
        if(i!=1&&tmp!=0) 
        {  
            for(int j=0;j<p[d];j++)  
            {
                tmp*=i;  
            }
        }  
        right_dfs(d+1,s+tmp);  
    } 
}  
int main() 
{  
    int i,j;  
    scanf("%d",&n); 
    scanf("%d",&M);  
    for(i=0;i<n;i++)  
    {   
        scanf("%d%d",&k[i],&p[i]);  
    } 
    mid=n/2;  
    cnt=0; 
    left_dfs(0,0); 
    right_dfs(mid,0); 
    printf("%d\n",cnt); 
    return 0;
}
相關文章
相關標籤/搜索