Description
在一个
k
维空间内,定义一个点的切比雪夫距离为
求在
Data Constraint
Code
枚举
j
表示有
通过简单的容斥可得方案数为
Answer=∑j=1kCjk∗2j∗[∑i=1n(ij−(i−1)j)∗i]
=∑j=1kCjk∗2j∗(ij+1−∑i=1n−1ij)
=∑j=1kCjk∗2j∗ij+1−∑j=1kCjk∗2j∗∑i=1n−1ij)
=∑j=1kCjk∗2j∗ij+1−∑i=1n−1∑j=1kCjk∗(2i)j∗1k−j)
=∑j=1kCjk∗2j∗ij+1−∑i=1n−1∑j=1kCjk∗(2i)j∗1k−j)
=∑j=1kCjk∗2j∗ij+1−∑i=1n−1[(2i+1)j−1]
左边那部分很好求,而
∑n−1i=1[(2i+1)j−1]
显然可以表示成一个
k
+
时间复杂度
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,j,l) for(int i=j;i<=l;++i)
#define fd(i,j,l) for(int i=j;i>=l;--i)
using namespace std;
typedef long long ll;
const ll N=12e5,mo=1e9+7;
ll ksm(ll o,ll t)
{
ll y=1;
for(;t;t>>=1,o=o*o%mo)
if(t&1)y=y*o%mo;
return y;
}
ll jc[N],ny[N],w[N],k,n;
ll C(ll a,ll b)
{return jc[a]*ny[b]%mo*ny[a-b]%mo;}
int main()
{
cin>>k>>n;
fo(i,1,k+2)w[i]=(w[i-1]+ksm(2*i+1,k)+mo-1)%mo;
jc[0]=ny[0]=jc[1]=ny[1]=1;
fo(i,2,k+2)jc[i]=jc[i-1]*i%mo;
ny[k+2]=ksm(jc[k+2],mo-2);
fd(i,k+1,1)ny[i]=ny[i+1]*(i+1)%mo;
ll ans=0,u=1,p=n%mo;
fo(j,1,k){
u=(u<<1)%mo; p=p*n%mo;
ans=(ans+u*C(k,j)%mo*p)%mo;
}
ll zd=1,a2=0;
--n;
if(n>k+2){
fo(i,1,k+2)zd=zd*(n-i)%mo;
fo(i,1,k+2){
ll op=zd*ksm(n-i,mo-2)%mo;
op=op*ny[i-1]%mo;
op=op*ny[k+2-i]%mo*((k+2-i)%2?-1:1);
op=(op+mo)%mo;
a2=(a2+op*w[i])%mo;
}
}else a2=w[n];
ans=(ans-a2+mo)%mo;
printf("%lld",ans);
}