hdu 3929 Big Coefficients(Lucas定理+容斥原理)
2014-03-31 20:52
330 查看
题意:求F(x) = (1+x)^a1 + (1+x)^a2 + ... + (1+x)^am.中系数为奇数的项的个数。
思路:由Lucas定理可知,(1+x)^n中奇数项的个数等于2^(n的二进制表示中1的个数)。Lucas定理相关证明可以看这里。然后就是利用容斥原理,把重复的减去,两项相交的结果中奇数项的个数为2^(a[i]&a[j]的二进制表示中1的个数)。需要注意的是,由于偶数个奇数项在一起并不是奇数项,因此这里要减去。
代码:
思路:由Lucas定理可知,(1+x)^n中奇数项的个数等于2^(n的二进制表示中1的个数)。Lucas定理相关证明可以看这里。然后就是利用容斥原理,把重复的减去,两项相交的结果中奇数项的个数为2^(a[i]&a[j]的二进制表示中1的个数)。需要注意的是,由于偶数个奇数项在一起并不是奇数项,因此这里要减去。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<set> #include<cmath> #include<vector> #define inf 0x3f3f3f3f #define Inf 0x3FFFFFFFFFFFFFFFLL #define eps 1e-9 #define pi acos(-1.0) using namespace std; typedef long long ll; const int maxn=20; ll a[maxn],ans; int n; int cal(ll x) { int cnt=0; while(x) { x=x&(x-1); cnt++; } return cnt; } void dfs(int p,ll msk,ll v) { ans+=(1LL<<cal(msk))*v; for(int i=p+1;i<n;++i) dfs(i,msk&a[i],-2*v); } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t,tcase=0; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<n;++i) scanf("%I64d",&a[i]); ans=0; for(int i=0;i<n;++i) dfs(i,a[i],1); printf("Case #%d: %I64d\n",++tcase,ans); } return 0; }
相关文章推荐
- 自动化测试工具
- Android NDK 工具链的使用方法(Standalone Toolchain)
- jQuery事件函数的整理
- apk反汇编之smali语法
- Notes for building gimp-print
- Singleton
- UVa 10420 - List of Conquests
- Selenium入门(一)安装、配置与第一条代码
- Struts2中过滤器和拦截器的区别
- 作业
- Cocos2d-x大型地图
- GetLastError()返回值大全
- 利用Java 3D技术播放动画之JMF技术
- python:利用asyncio进行快速抓取
- java并发编程实践学习(一)java的类锁和对象锁
- [翻译] 极具动感的 FRDLivelyButton
- 2014阿里前端实习生在线测试题目
- 将char转换成wchar_t的方法
- hdu 1421
- 安装完Oracle数据库,给scott账户解锁方法