[子集DP][Lucas定理] BZOJ 4903: [Ctsc2017]吉夫特
2018-01-15 16:32
316 查看
Solution
原来可以把简单的题面写的那么长~根据Lucas定理,(nm)≡(⌊n2⌋⌊m2⌋)(nmod2mmod2)(mod2)有(00)=1,(01)=0,(10)=1,(11)=1那么当这个柿子成立当且仅当n and m=m啦,那就可以DP了。
跑的真快
#include <bits/stdc++.h> #define show(x) cerr << #x << " = " << x << endl using namespace std; typedef long long ll; typedef pair<int, int> Pairs; const int N = 233333; const int MOD = 1000000007; inline char get(void) { static char buf[100000], *S = buf, *T = buf; if (S == T) { T = (S = buf) + fread(buf, 1, 100000, stdin); if (S == T) return EOF; } return *S++; } template<typename T> inline void read(T &x) { static char c; x = 0; int sgn = 0; for (c = get(); c < '0' || c > '9'; c = get()) if (c == '-') sgn = 1; for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0'; if (sgn) x = -x; } int f , a ; int n, U, ans; inline void Add(int &x, int a) { x += a; while (x >= MOD) x -= MOD; } int main(void) { freopen("1.in", "r", stdin); freopen("1.out", "w", stdout); read(n); U = 233333; for (int i = 1; i <= n; i++) read(a[i]); for (int i = 1; i <= n; i++) { for (int T = a[i]; T <= U; T = (T + 1) | a[i]) Add(f[a[i]], f[T]); Add(ans, f[a[i]]); Add(f[a[i]], 1); } cout << ans << endl; return 0; }
相关文章推荐
- BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
- loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】
- 【CTSC2017】【BZOJ4903】吉夫特 卢卡斯定理 DP
- [CTSC2017][bzoj4903] 吉夫特 [状压dp+Lucas定理]
- bzoj 4903: [Ctsc2017]吉夫特【lucas+状压dp】
- [CTSC2017]吉夫特(Lucas定理,DP)
- [BZOJ4903][UOJ300][Ctsc2017]吉夫特(DP+优化)
- 【BZOJ4903】【CTSC2017】吉夫特 [DP]
- 【bzoj4903/uoj300】[CTSC2017]吉夫特 数论+状压dp
- [DP 分块子集枚举] UOJ#300.【CTSC2017】吉夫特
- BZOJ4903 [Ctsc2017]吉夫特
- [UOJ 300][CTSC2017]吉夫特-扩展Lucas定理
- bzoj千题计划247:bzoj4903: [Ctsc2017]吉夫特
- [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
- BZOJ 3782: 上学路线 [Lucas定理 DP]
- [数位DP Lucas定理] 2017 计蒜之道 复赛 E. 商汤智能机器人
- bzoj 2629: binomial (FFT+DP+Lucas定理+短除法)
- BZOJ 2111: [ZJOI2010]Perm 排列计数(DP+Lucas定理)
- uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划
- BZOJ4737 组合数问题 【Lucas定理 + 数位dp】