hdu 4810 思维题+二进制位规律+异或规律 213南京现场赛题
来源:互联网 发布:开淘宝c店 编辑:程序博客网 时间:2024/05/01 19:49
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;}
2 0
- hdu 4810 思维题+二进制位规律+异或规律 213南京现场赛题
- HDU 4473 Exam 2012成都现场赛J题(规律+思维)
- hdu 4810 2013南京区域赛 杨辉三角组合数+容斥原理思维+找规律
- HDU 2582 规律题
- hdu 1792规律题
- hdu 4925规律题
- hdu 5524 规律题
- hdu 4148 规律题
- HDU 6043 规律题
- Codeforces 501C:Misha and Forest(好题+思维+异或的运算规律+树)
- hdu 5984 Pocky (16青岛现场赛)找规律
- HDU 6048 思维+找规律
- HDU 1046 数学规律题
- HDU 4602 Partition 规律题
- HDU 4279 Number 规律题
- hdu 1046 Gridland(规律题)
- hdu 1021 (找规律题)
- HDU 1719 Friend 【规律题】
- 关于break语句与goto语句的区分
- win7安装nodejs失败(node.js setup wizard ended prematurely)
- struts2简介
- 解决控制台输入乱码,用Scanner输入时输入汉字,但是软件读入时出现乱码
- newlisp HTTP Basic Authentication
- hdu 4810 思维题+二进制位规律+异或规律 213南京现场赛题
- poj 3311 Hie with the Pie (TSP问题)
- goto的用法
- maven发布jar到远程仓库常见问题汇总
- 2014/10/2 上午读书记
- activiti流程启动问题汇总
- BZOJ 1901 Zju 2112 Dynamic Rankings 动态维护第k小 树套树
- mysql索引导出
- mac ping