RT
样例没过 A了
建议把样例加进去。。。。
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn = 8;
int k[maxn],p[maxn];
int cnt;
const int maxm = 4e6 + 10;
int a[maxm];
//map < int , int > b;
int b[maxm];
int cnt1,cnt2;
void dfs1(int x , int sum) {
if(x > n / 2) {
a[++ cnt1] = sum;
return ;
}
for(int i = 1 ; i <= m ; i ++) dfs1(x + 1 , sum + k[x] * pow(i , p[x]));
}
void dfs2(int x , int sum) {
if(x > n) {
b[++ cnt2] = sum;
return ;
}
for(int i = 1 ; i <= m ; i ++) dfs2(x + 1 , sum + k[x] * pow(i , p[x]));
}
int ans;
int main() {
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++) cin >> k[i] >> p[i];
dfs1(1 , 0);
dfs2(n / 2 + 1 , 0);
sort(b + 1 , b + cnt2 + 1);
// cout << cnt1 << " " << cnt2 << endl;
// cout << "wdnmd";
for(int i = 1 ; i <= cnt1 ; i ++) {
ans += (upper_bound(b + 1 , b + cnt2 + 1 , - a[i]) - lower_bound(b + 1 , b + cnt2 + 1 , - a[i]));
}
cout << ans;
}