【WC2015模拟2.6】Circle
2016-12-27 22:01
393 查看
Description
一开始有个n个在[0,2^m)区间内的数。每一秒每一个数将会+1,然后对2^m取模。
求在[1,T]秒内,有多少个时间,使得这n个数的异或值为S。
n<=10^5,m<=50,T<=10^16
Solution
很显然的与位运算有关的题目。首先我们就相当于求给出一个上界up,[1,up]中有多少个数x使得所有的(ai+x)%2^m的异或值为S。
考虑Dp,发现我们只需要二进制的后m位的异或值与S相同,这样就不用考虑%的问题。
但是发现加法会产生进位,比较难处理。
考虑设状态Fi,j,0\1表示后i-1位已经确定了,第i-1位向第i位产生了j个进位,0\1表示加的数和上界的关系
我们可以发现,因为加的数一样,这j个进位一定是后i-1位最大的那j个数所产生的。
那么我们可以预处理对于每个i,j,产生进位的是哪些数。
我们只需要对这n个值排序就好了,排m次。
排序的考虑类似基数排序,从上一次排序的结果O(N)推出这一次的排序结果。
然后转移分情况讨论就好了,转移比较复杂,详细见代码。
一道好题,(⊙v⊙)嗯。
Code
#include <cstdio> #include <cstring> #include <algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; const int N=1e5+5,M=55; int n,m,d[M]; ll t,s,cnt,a ,mi[M],f[M] [2],c[M] ; bool cmp(ll x,ll y) {return x>y;} ll dp(ll upper) { memset(f,0,sizeof(f));f[0][0][0]=1; fo(i,0,m-1) fo(up,0,1) { int ad=d[i],k=0,x; fo(j,0,n) { if (f[i][j][up]) { if ((s&mi[i])&&(ad&1)||!(s&mi[i])&&!(ad&1)) { if (!(upper&mi[i])&&up) x=1;else x=0; f[i+1][k][x]+=f[i][j][up]; } if ((s&mi[i])&&((n-ad)&1)||!(s&mi[i])&&!((n-ad)&1)) { if ((upper&mi[i])&&!up) x=0;else x=1; f[i+1][k+ad][x]+=f[i][j][up]; } } if (i&&j<n) { if (a[c[i-1][j+1]]&mi[i]) k++,ad--; else ad++; } } } ll ans=0; fo(i,0,n) ans+=f[m][i][0]; return ans; } int main() { scanf("%d%d%lld%lld",&n,&m,&s,&t);cnt=s; fo(i,1,n) scanf("%lld",&a[i]),cnt^=a[i]; mi[0]=1;fo(i,1,m+1) mi[i]=mi[i-1]*2; fo(j,0,m-1) { fo(i,1,n) d[j]+=(a[i]&mi[j])>0; if (j) { int tot=0; fo(i,1,n) if (a[c[j-1][i]]&mi[j]) c[j][++tot]=c[j-1][i]; fo(i,1,n) if (!(a[c[j-1][i]]&mi[j])) c[j][++tot]=c[j-1][i]; } else { int tot=0; fo(i,1,n) if (a[i]&1) c[j][++tot]=i; fo(i,1,n) if (!(a[i]&1)) c[j][++tot]=i; } } printf("%lld\n",t/mi[m]*dp(mi[m]-1)+dp(t%mi[m])-(cnt==0)); }
相关文章推荐
- JZOJ 3988 【WC2015模拟2.6】Circle
- 【WC2015模拟2.6】Tree
- JZOJ 3987 【WC2015模拟2.6】Tree
- 【WC2015模拟2.5】数组
- 【WC2015模拟2.5】数组
- 【JZOJ3973】【NOI2015模拟1.10】【NOI2013湖南省队集训】黑白树(wbtree)(并查集)
- 【NOIP2015 10.29模拟】总结
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest E】【模拟 贪心】Easy Arithmetic 需要补 加减法表达式添加加减号使得数
- 【BZOJ4029】【HEOI2015】定价 模拟
- hdu5387(2015多校8)--Clock(模拟)
- 【WC2018模拟2017.12.25】总结
- 2015-2016ACM-ICPC NEER northern-subregional-contest D Distribution in Metagonia 模拟构造
- JZOJ 4296【NOIP2015模拟11.2】有趣的有趣的家庭菜园
- 【省选专题一】图论 jzoj 3936. 【GDOI2015模拟11.22】假期计划 spfa
- 【NOIP2015模拟11.3】备用钥匙
- 【NOIP2015模拟11.3】IOIOI卡片占卜
- (NOIP2015)复赛模拟试题 vijos1165 火烧赤壁
- 模拟linux的命令wc编写的一个函数
- Python实战(1)模拟wc命令部分功能
- JZOJ 3786. 【NOI2015模拟8.19】图