计蒜客 方程的解数(dfs)

题目:
蒜头军在求解一个n元的高次方程
k1 * x1p2 +k2 * x2p2 +…
其中,x1,x2…xn是未知数,k1,k2…kn是系数,p1,p2…pn是指数。方程中所有数都一定是整数。
假设未知数1<=xi<=M,i=1…n。你能帮蒜头军就算出这个方程的整数解个数吗?
输入格式:
第一行:
1<=n<=4;
第二行:
1<=M<=150;
第三到最后一行
左边:ki 右边:pi
输出格式:
输出解的个数
样例输入:

3
100
1 2
-1 2
1 2

样例输出:

104

踩了坑:
坑1.pow因为运算太慢,直接超时
坑2.没有让超过n的数据返回

#include
using namespace std;
int n,m;
int a[5];   //系数
int b[5];   //指数
int res = 0;
int mypow[153][5];
void MyPow()  //递归计算次方,暴力打表(没想到比pow快?)
{
    memset(mypow,1,sizeof(mypow));
    for(int i=1;i<=150;i++)
        for(int j=1;j<=4;j++)
            mypow[i][j] = i*mypow[i][j-1];
}
void dfs(int k,int val)
{
    if(k>n) return ;   //前几次忘了写,一直通不过
    if(k==n)
    {
        if(val==0)
            res++;
        else
            return;
    }
	for(int i=1;i<=m;i++)
    {
        dfs(k+1,val+a[k]*mypow[i][b[k]]);
    }
}

int main()
{
    cin>>n>>m;
    MyPow();
    for(int i=0;i<n;i++)
    {
        cin>>a[i]>>b[i];
    }
    dfs(0,0);
    cout<<res<<endl;
}

你可能感兴趣的:(算法)