你的忏悔或许会让你心安,但未必别人如此。
题目描述
研究中心正在研究一种数列,该数列由整数组成,每次可以对相邻的两个数进行相减操作,并删去这两个数,将运算结果替换进去,直到此数列只剩一个数为止。现在此研究中心欲使最后剩下的数字为目标数,请你帮助他们完成这个任务(假设:在运算过程中的所有数都在longint范围内)。
若此数列为{12,10,4,3,5),目标数为4,E(n)表示对第n和第n+l数进行相减并替换。
E(2)=(12,6,3,5)(6=10-4)
E(3)=(12,6,-2) (-2=3-5)
E(2)=(12,8) (8=6-(-2))
E(1)=(4)(4=12-8)
则最后达到目的,数列仅剩一目标数,则此过程为:2、3、2、1。
输入
第1行两个整数N(3≤N≤i0)和M,为数列中数的个数和目标数。
第2行N个整数,为此数列中的数。
输出
1行,输出总共可行方案的数量。
样例输入
复制样例数据
5 4 12 10 4 3 5
样例输出
3
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
int M,N,mp[100],jg=0,cd;
void dfs(){
if(cd==0){
if(mp[1]==M)
jg++;
return;
}
for(int i=1;i<=cd;i++){
int ss=mp[i];
mp[i]=mp[i]-mp[i+1];
for(int j=i+1;j<=cd;j++)
mp[j]=mp[j+1];
cd--;
dfs();
cd++;
for(int j=cd+1;j>=i+2;j--)
mp[j]=mp[j-1];
mp[i+1]=ss-mp[i];
mp[i]=ss;
}
}
int main(){
cin>>N>>M;
cd=N-1;
for(int i=1;i<=N;i++)
cin>>mp[i];
dfs();
cout<<jg<<endl;
return 0;
}