题解:P8757 [蓝桥杯 2021 省 A2] 完美序列
简单组合题。
题目分析
先考虑什么时候会有最长完美序列。
假设现在这个序列由
但其实不止
再来求由这两种数开头的完美序列的权值和。
设
设
最后求答案。我们可以钦定使用一种数列在排列的任意位置,即在
预处理复杂度
AC Code
#include<bits/stdc++.h>
//#include<bits/extc++.h>
//bool Mst;
using namespace std;
using ll=long long;
using ld=long double;
//#define int ll
using pii=pair<int,int>;
const int N=1e6+5,mod=1e9+7;
inline ll rd(ll x,ll M=mod){return x>=M?x-M:x;}
inline ll pr(ll x,ll M=mod){return x<0?x+M:x;}
namespace CM
{
int inv[N],jc[N],invjc[N];
void init()
{
inv[0]=jc[0]=invjc[0]=inv[1]=jc[1]=invjc[1]=1;
for(int i=2;i<N;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod,jc[i]=1ll*jc[i-1]*i%mod,invjc[i]=1ll*invjc[i-1]*inv[i]%mod;
}
inline int C(int n,int m){return (n<0||m<0||m<n)?0:1ll*jc[m]*invjc[n]%mod*invjc[m-n]%mod;}
inline int A(int n,int m){return (n<0||m<0||m<n)?0:1ll*jc[m]*invjc[m-n]%mod;}
}
int res2[N],res3[N];
//bool Med;
signed main()
{
// cerr<<"Memory Size: "<<abs((&Med)-(&Mst))/1024.0/1024<<" MB\n";
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
CM::init();
res2[0]=3;
for(int i=1,pw=4;i<=25;i++,pw=rd(pw*2)) res2[i]=rd(res2[i-1]+pw);
res3[0]=4;
for(int i=1,pw=6;i<=25;i++,pw=rd(pw*2)) res3[i]=(1ll*(i+1)*pw+rd(res2[i-1]+res3[i-1]))%mod;
int t;
cin>>t;
while(t--) [&]()->void
{
int n,ans=0;
cin>>n;
if(n==1) return cout<<"1\n",void();
int k=__lg(n),p=1<<k;
ans=res2[k-1];
if(n&(p>>1)) ans=rd(ans+res3[k-1]);
ans=1ll*ans*CM::A(n-(k+1),n)%mod;
cout<<ans<<"\n";
}();
return 0;
}