-
P3773 [CTSC2017]吉夫特
- 其实是要求每一项组合数mod2都不能为0,也就是每一项都必须为奇数。百度之后可以知道。
- 若为奇数,那么有(n&m)=m。也就是说如果用状压的思想将n,m表示为二进制数,那么m一定是n的子集。
-
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 234567 #define mod 1000000007 int n,pos[maxn]; ll ans; int a[maxn],dp[maxn]; int main() { scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); pos[a[i]]=i; dp[a[i]]=1; } for(int i=1; i<=n; i++) for(int j=((a[i]-1)&a[i]); j; j=((j-1)&a[i])) if(pos[j]>i) dp[j]=(dp[j]+dp[a[i]])%mod; for(int i=1; i<=n; i++) ans=(ans+dp[a[i]]-1+mod)%mod; printf("%lld\n",ans); return 0; }
P3773 [CTSC2017]吉夫特-子集DP-lacus定理
最新推荐文章于 2020-06-27 00:07:14 发布