UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#213445#70. 量子二叉堆laiyishiJudgement Failed//C++930b2024-11-11 22:49:182024-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);
}

Details

Failed to show details