rt,本题我是用meet in the middle做的,代码如下
#include<iostream>
#include<map>
using namespace std;
int x,y;
int len1;
int ans;
int k[7],p[7];
map<long long,int> mp;
long long quick_pow(int base,int n){
long long sum=1;
int b=base;
while(n){
if(n&1){
n--;
sum*=b;
}
n>>=1;
b=b*b;
}
return sum;
}
void dfs1(int f,int sum){
if(f<=len1){
for(int i=1;i<=y;i++){
dfs1(f+1,sum+k[f]*quick_pow(i,p[f]));
}
return;
}
mp[sum]++;
}
void dfs2(int f,int sum){
if(f>len1){
for(int i=1;i<=y;i++){
dfs2(f-1,sum+k[f]*quick_pow(i,p[f]));
}
return;
}
ans+=mp[-sum];
}
int main(){
cin>>x>>y;
for(int i=1;i<=x;i++){
cin>>k[i]>>p[i];
}
len1=x/2;
dfs1(1,0);
dfs2(x,0);
cout<<ans;
}
我确实过了,但我看测试数据中时间最长的跑了4s(如果本题的时间限制是1s就过不了了),所以我想请问下有没有办法能改进时间复杂度,谢谢!