标签:des style http color java os io strong
4 1024 512 256 256 4 1024 1024 1024 1024 5 1024 512 512 512 1 0
Case #1: 1 Case #2: 11 Case #3: 8HintIn the first case, we should choose all the numbers. In the second case, all the subsequences which contain more than one number are good.
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #include <sstream> #define maxn 100005 #define MAXN 100005 #define mod 998244353 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-8 typedef long long ll; using namespace std; int n,m,tot; int mp[2050],cnt[13],p[13],ed[13]; ll ans,dp[13][2050]; ll inv[100005]; int a[12]= {2048,1024,512,256,128,64,32,16,8,4,2,1}; void scanf_(int&ret) { char c; ret=0; while((c=getchar())<'0'||c>'9'); while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar(); } ll pow_mod(ll x,ll n) { ll res = 1; while(n) { if(n&1) res = res * x %mod; x = x * x %mod; n >>= 1; } return res; } void egcd(ll a,ll b,ll &x,ll &y) { if (b==0) { x=1,y=0; return ; } egcd(b,a%b,x,y); ll t=x; x=y; y=t-a/b*x; } void solve() { int i,j,k; memset(dp,0,sizeof(dp)); for(i=0; i<=11; i++) { ed[i]=min(cnt[i],a[i]-1); } dp[0][0]=1; ll h=1; for(i=1; i<=ed[0]; i++) { h=((h*(cnt[0]-i+1))%mod)*inv[i]%mod; dp[0][i]=h; } for(i=0; i<11; i++) { for(j=0; j<a[i]; j++) { if(!dp[i][j]) continue ; h=1; dp[i+1][j>>1]+=dp[i][j]; dp[i+1][j>>1]%=mod; for(k=1; k<=ed[i+1]; k++) { if((j>>1)+k<a[i+1]) { h=((h*(cnt[i+1]-k+1))%mod)*inv[k]%mod; dp[i+1][(j>>1)+k]+=h*dp[i][j]; dp[i+1][(j>>1)+k]%=mod; } else break ; } } } ans=((pow_mod(2,n-tot)-dp[11][0]+mod)%mod)*pow_mod(2,tot); ans%=mod; } int main() { int i,j,u,test=0; for(i=1; i<=100000; i++) { ll x,y; egcd(i,mod,x,y); x=(x+mod)%mod; inv[i]=x; } memset(mp,-1,sizeof(mp)); p[0]=1; mp[1]=0; for(i=1; i<=11; i++) { p[i]=p[i-1]*2; mp[p[i]]=i; } while(1) { scanf_(n); if(n==0) break ; tot=0; memset(cnt,0,sizeof(cnt)); for(i=1; i<=n; i++) { scanf_(u); if(mp[u]!=-1) cnt[mp[u]]++; else tot++; } solve(); printf("Case #%d: %I64d\n",++test,ans); } return 0; } /* 11 256 256 256 256 256 256 512 512 1024 1024 2048 */
hdu 4945 2048 (dp+组合数),布布扣,bubuko.com
标签:des style http color java os io strong
原文地址:http://blog.csdn.net/tobewhatyouwanttobe/article/details/38636093