首页 > 代码库 > hdu 4810 思维题+二进制位规律+异或规律 213南京现场赛题
hdu 4810 思维题+二进制位规律+异或规律 213南京现场赛题
http://acm.hdu.edu.cn/showproblem.php?pid=4810
以前做过一些涉及异或的题,化为二进制形式,然后统计0,1个数是一种很常见的处理方法,但是在做这个题的时候居然没尝试,脑残啊......
一开始看5s时限,感觉稍微暴力一点应该可以,于是YY的O(n^3)算法但是没去实现,明显超时啊,大致就是通过C(n,1)的组合可以在O(n^2)内处理出C(n,2)的组合,在通过C(n,2)处理出C(n,3)的组合....但是C(n,2)已经是n^2个数了,所以算法是O(n^3).....必悲剧,
看了题解,稍微花下,然后A掉了
方法:
涉及异或的题,化为二进制形式,然后统计0,1个数是一种很常见的处理方法
然后逐位算 i个数第j为上的和为segma(C[cnt[j]][k]*C[n-cnt[j]][i-k]) cnt[j]是n个数第j位上1的个数,当然还是要乘以(1<<j) 假设最右边一位是第0位
//#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <iostream> #include <iomanip> #include <cmath> #include <map> #include <set> #include <queue> using namespace std; #define ls(rt) rt*2 #define rs(rt) rt*2+1 #define ll long long #define ull unsigned long long #define rep(i,s,e) for(int i=s;i<e;i++) #define repe(i,s,e) for(int i=s;i<=e;i++) #define CL(a,b) memset(a,b,sizeof(a)) #define IN(s) freopen(s,"r",stdin) #define OUT(s) freopen(s,"w",stdout) const ll ll_INF = ((ull)(-1))>>1; const double EPS = 1e-8; const double pi = acos(-1.0); const int INF = 100000000; const int MAXN = 1e3+50; const int maxc=1005; const int MOD = 1e6+3; ll C[maxc][maxc],mi[50],out[MAXN]; int n; int num[MAXN],cnt[65]; void calC(){ // C(n,k),n个数里选k个 int i,j; for(int i=0;i<maxc;i++) C[i][i]=C[i][0]=1LL; for(int i=2;i<maxc;i++) for(j=1;j<i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD; mi[0]=1; for(int i=1;i<=33;i++) mi[i]=mi[i-1]*2%MOD; } void cal (int x) { int f=0; while(x) { if(x&1)cnt[f]++; f++; x/=2; } } void print() { printf("%I64d",out[1]); for(int i=2;i<=n;i++) printf(" %I64d",out[i]); putchar('\n'); } int main() { //IN("hdu4810.txt"); calC(); while(~scanf("%d",&n)) { CL(cnt,0); int mmax=-1; for(int i=0;i<n;i++) { scanf("%d",&num[i]); cal(num[i]); } int up=32; while(!cnt[up] && up>=0)--up; for(int i=1;i<=n;i++) { ll ans=0; for(int j=0;j<=up;j++) { ll tmp=0; for(int k=1;k<=cnt[j] && k<=i;k+=2)/// { //tmp=(tmp+C[cnt[j]][k])%MOD; tmp=(tmp+C[cnt[j]][k]*C[n-cnt[j]][i-k])%MOD; } tmp=(tmp*mi[j])%MOD; ans=(ans+tmp)%MOD; } out[i]=ans; } print(); } return 0; }
hdu 4810 思维题+二进制位规律+异或规律 213南京现场赛题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。