hdu 3929 Big Coefficients (递归形式的容斥原理+lucas定理的结论)
题意:F(x) = (1+x)^a1 + (1+x)^a2 + … + (1+x)^am,求系数是奇数的项的个数。 思路:解题报告 涉及到的由lucas定理得到的推论的证明lucas定理证明 以及这篇理解里有递归形式的容斥定理的一般写法。。递归形式的容斥定理
dfs(int beg,set S,int sym)
{
ans+=num(S)*sym;
for(int i=beg;i<=n;i++)
dfs(i,S∩A[i],sym*-1);
}
for(int i=1;i<=n;i++)
dfs(i,A[i],1);
第一次接触递归形式的容斥定理...还不是特别理解,据说要比循环的写法少一层msk(应该是少一个1</* *********************************************** Author :111qqz Created Time :2016年03月03日 星期四 18时55分21秒 File Name :code/hdu/3929.cpp ************************************************ */
#include
using namespace std; const double eps = 1E-8; const int dx4[4]={1,0,0,-1}; const int dy4[4]={0,-1,1,0}; const int inf = 0x3f3f3f3f; const int N=20; int n; LL x[N],ans; LL getbit(LL x) { LL res = 0LL; while (x) { x=x&(x-1); res++; } return res; }
void dfs(int id,LL msk,LL f) { ans +=(1LL<<getbit(msk))f; for ( LL i = id+1 ; i < n ; i++) dfs(i,msk&x[i],-2f); }
int main() { #ifndef ONLINE_JUDGE freopen("code/in.txt","r",stdin); #endif
// ios::sync_with_stdio(false); int T; int cas = 0 ; cin>>T; while (T--) { cin>>n; for ( int i = 0 ; i < n ; i++) scanf("%lld",&x[i]);
ans = 0LL;
for ( int i = 0 ; i < n ; i++)
{
dfs(i,x[i],1);
// cout<<"ans:"<<ans<<endl; }
printf("Case #%d: %lld\n",++cas,ans);
}
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;
}