[数位DP] ZROI 2017 提高3 T1 树状数组
2017-10-07 12:54
204 查看
不错的题。这个应该从二进制角度考虑。我们知道树状数组每次就是把二进制最末尾的 1 去掉。
那么考虑对 r 和 l−1 分别加 1 减 1 后,有值的节点个数即 cnt(r)+cnt(l−1)−2∗cnt(prefix(r,l−1)) 。其中cnt 是二进制下 1 的个数,prefix 是公共前缀。这个不难得到。
然后就是如何计算总贡献了:
∑0≤x<y≤ncnt(x)+cnt(y)−2∗cnt(prefix(x,y))
这可以简单的数位 DP 得到:f[i][0/1][0/1] 表示填了前 i 位,x 是否已小于y , y 是否已小于 n ,的贡献和。还要记个 g[i][0/1][0/1] 表示方案数。就可以转移了。
那么考虑对 r 和 l−1 分别加 1 减 1 后,有值的节点个数即 cnt(r)+cnt(l−1)−2∗cnt(prefix(r,l−1)) 。其中cnt 是二进制下 1 的个数,prefix 是公共前缀。这个不难得到。
然后就是如何计算总贡献了:
∑0≤x<y≤ncnt(x)+cnt(y)−2∗cnt(prefix(x,y))
这可以简单的数位 DP 得到:f[i][0/1][0/1] 表示填了前 i 位,x 是否已小于y , y 是否已小于 n ,的贡献和。还要记个 g[i][0/1][0/1] 表示方案数。就可以转移了。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MOD=1e9+7; typedef long long LL; int _test,f[70][2][2],g[70][2][2],a[70]; //f[i][0:L==R 1:L<R ][0:R==n 1:R<n ] LL n; int Solve(){ memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); a[0]=0; LL _n=n; do a[++a[0]]=_n&1, _n>>=1; while(_n); g[a[0]+1][0][0]=1; for(int i=a[0]+1;i>=2;i--) for(int j1=0;j1<=1;j1++) for(int j2=0;j2<=1;j2++) if(g[i][j1][j2]){ for(int r=0;r<=(j2?1:a[i-1]);r++) for(int l=0;l<=(j1?1:r);l++){ (f[i-1][j1|(l<r)][j2|(r<a[i-1])]+=(f[i][j1][j2]+(LL)g[i][j1][j2]*(l+r-(l&&r&&!j1)*2))%MOD)%=MOD; (g[i-1][j1|(l<r)][j2|(r<a[i-1])]+=g[i][j1][j2])%=MOD; } } return (f[1][1][0]+f[1][1][1])%MOD; } int main(){ scanf("%d",&_test); while(_test--){ scanf("%lld",&n); printf("%d\n",Solve()); } return 0; }
相关文章推荐
- JZOJ5379. 【NOIP2017提高A组模拟9.21】Victor爱数字 数位DP
- [补集转化 DP] ZROI 2017提高7 强军战歌
- [DP] ZROI 2017 提高3 T3 建筑
- [DP] ZROI 2017提高1 T2.给 Ca
- [DP] ZROI 2017 提高6 T2 异或统计
- 5332. 【NOIP2017提高A组模拟8.23】密码 AC自动机+数位DP
- [DP] ZROI 2017提高 5 T2. 石头剪刀布
- 【bzoj4822/bzoj1935】[Cqoi2017]老C的任务/[Shoi2007]Tree 园丁的烦恼 树状数组
- 【JZOJ5330】【NOIP提高组模拟】密码(库默尔定理、数位DP)
- BZOJ4785 [Zjoi2017]树状数组
- 2017暑期集训Day 25 树状数组
- 【二维树状数组优化dp】[Scoi2014] bzoj3594方伯伯的玉米田
- hdu 4622 Reincarnation trie树+树状数组/dp
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
- CDOJ1583-树状数组 (2017 UESTC Training for Data Structures)
- 2017暑期ACM俱乐部个人训练赛第2场 G题 Balanced Photo(树状数组求逆序对)
- dp+树状数组 bzoj1264 AHOI2006基因匹配
- NOIP--组合数问题(数位DP+二维前缀和数组优化)
- hdu 4734 F(x) (数位DP中dp数组的重用)
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛G题Query on a strin(树状数组+暴力更新)