题目:Axis Walking
思路:
用lowbit优化的dp。
注意此题卡常,不能用%,应改成减。
还要注意要使用long long。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 24
#define ll long long
#define maxM (1<<24)
#define md 1000000007
int n,m;
int a[maxn+5],b[3];
ll sum[maxM+5]={0},f[maxM+5]={0};
int lowbit(int x) {
return x&(-x);
}
void readin() {
scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%d",&a[i]);
sum[(1<<i)]=a[i];
}
scanf("%d",&m);
for(int i=0;i<m;i++) {
scanf("%d",&b[i]);
}
}
ll dp(){
f[0]=1;
int M=(1<<n);
for(int i=1;i<M;i++) {
sum[i]=sum[i&(~lowbit(i))]+sum[lowbit(i)];
if(sum[i]==b[1]||sum[i]==b[0]) continue;
for(int j=i;j;j-=lowbit(j)) {
f[i]=f[i]+f[i&~lowbit(j)];
if(f[i]>md) f[i]-=md;
}
}
return f[M-1];
}
int main(){
readin();
ll ans=dp();
printf("%lld",ans);
return 0;
}