| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 38951 | LYLAKIOIAKIOI | 【BJ】T1 | C++ | 解答错误 | 62 | 1999 MS | 131328 KB | 2906 | 2025-11-19 20:45:43 |
#include<bits/stdc++.h> #define ppc __builtin_popcountll #define ctz __builtin_ctzll #define clz __builtin_clzll #define double long double using namespace std; int hb(int x){return 63-clz(x);} namespace sub1{ const int N=35,MS=1.7e7+10; int f[N],iv[N],w[MS],vl[MS];int n,mod; int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; a=1ll*a*a%mod;b>>=1; }return x; } void main(){ cin>>n>>mod; for(int i=1;i<=n;i++) iv[i]=qp(i,mod-2); int U=(1<<n)-1; int ans=0; for(int i=U;i>=1;i--){ int now=0; if(i==U){ vl[i]=iv[n]; }else{ now=vl[i|(1<<hb(U^i))]; vl[i]=1ll*now*(iv[n-hb(U^i)-1]+1)%mod; } /*int sum=iv[n],now=0; int tmp=i^U; while(tmp!=0){ int x=ctz(tmp); //cout<<tmp<<' '<<x<<endl; now=sum;sum=(sum+1ll*now*iv[n-(x+1)])%mod; tmp^=(1<<x); }*/ /*for(int j=1;j<=n;j++){ if((i>>(j-1))&1) continue; now=sum;sum=(sum+1ll*now*iv[n-j])%mod; }*/ if((i>>(n-1))&1) now=0; now=(mod+1-now)%mod; if((ppc(i)+1)&1) now=(mod-now)%mod; w[i]=now; //if((n-ppc(i))&1) ans=(ans+mod-f[n])%mod; //else ans=(ans+f[n])%mod; //cout<<i<<' '<<f[n]*3ll%mod<<endl; }//cout<<ans<<endl; int mul=1;w[0]=1; for(int i=1;i<=U;i++) mul=1ll*mul*w[i]%mod; vl[U]=qp(mul,mod-2); for(int i=U;i>=1;i--) vl[i-1]=1ll*vl[i]*w[i]%mod; for(int i=1;i<=U;i++) w[i]=1ll*w[i]*w[i-1]%mod; for(int i=1;i<=U;i++){ ans=(ans+1ll*vl[i]*w[i-1])%mod; }cout<<ans<<endl; } } namespace sub2{ const int N=35,MS=1.7e7+10; int n; void main(){ cin>>n; int U=(1<<n)-1; double ans=0; for(int i=U;i>=1;i--){ double sum=1.0/n,now=0; int tmp=i^U; while(tmp!=0){ int x=ctz(tmp); //cout<<tmp<<' '<<x<<endl; now=sum;sum+=now/(n-(x+1)); tmp^=(1<<x); } /*for(int j=1;j<=n;j++){ if((i>>(j-1))&1) continue; now=sum;sum=(sum+1ll*now*iv[n-j])%mod; }*/ if((i>>(n-1))&1) now=0; now=1/(1-now); if((ppc(i)+1)&1) now=-now; ans+=now; } printf("%.10Lf\n",ans); } } int main(){ //freopen("read.in","r",stdin); //freopen("read.out","w",stdout); int op;cin>>op; if(op==1){ sub1::main(); }else{ sub2::main(); } return 0; }