ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#213445 | #70. 量子二叉堆 | laiyishi | Judgement Failed | / | / | C++ | 930b | 2024-11-11 22:49:18 | 2024-11-11 22:49:23 |
answer
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int n,fac[5000005],ifac[5000005];long long d[5000005];
set<int>st;
int fmi(int k,int t){
if(t==1)return k;
if(t==0)return 1;
int ans=fmi(k,t>>1);
return 1ll*ans*ans%mod*fmi(k,t&1)%mod;
}
int C(int x,int y){
return 1ll*fac[x]*ifac[y]%mod*ifac[x-y]%mod;
}
int l(int x){
int i;
for(i=1;((1<<i)-1)<x;i++);
if(x>(((1<<i)-1+(1<<(i-1))-1)>>1))return (1<<(i-1))-1;
else return x-(1<<(i-2));
}
int f(int x){
//cout<<x<<'\n';
if(d[x])return d[x];
int ll=l(x),rr=x-1-ll;
return d[x]=1ll*f(ll)*f(rr)%mod*C(x-1,ll)%mod;
}
int main(){
scanf("%d",&n);
//int start=clock();
fac[0]=1,ifac[0]=1;
for(int i=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%mod;
ifac[n]=fmi(fac[n],mod-2);
for(int i=n-1;i>=1;i--)ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
//printf("ok\n");
d[0]=d[1]=1;
printf("%d\n",1ll*f(n)*2%mod);
//printf("%d\n",clock()-start);
}
详细
Failed to show details