题目描述:
雾
题目分析:
观察发现越大的数排在中间位置对答案越有利,所以就可以贪心了
1 3 4 2
那么第一个位置1对答案贡献1次
第二个位置3对答案贡献3次
第三个位置4对答案贡献3次
第四个位置2对答案贡献1次
不难发现这个贡献次数为杨辉三角(就是组合数)
我们可以O(n^2)求出组合数对10007的取模
ans=∑ni=1C(n,i)∗ians=∑i=1nC(n,i)∗i
N过于大,观察模数较小,套用卢卡斯定理
题目链接:
Ac 代码:
// luogu-judger-enable-o2
#include <cstdio>
#include <iostream>
#include <cstring>
#define ll long long
ll num[11000],inv[11000];
ll mod=10007;
void pre()
{
num[0]=num[1]=inv[0]=inv[1]=1;
for(int i=2;i<=mod-1;i++) num[i]=num[i-1]*i%mod;
for(int i=2;i<=mod-1;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=2;i<=mod-1;i++) inv[i]=(inv[i-1]*inv[i])%mod;
}
ll Lucas(ll n,ll m)
{
if(n<m) return 0;
if(n<mod&&m<mod) return num[n]*inv[m]%mod*inv[n-m]%mod;
return Lucas(n/mod,m/mod)*Lucas(n%mod,m%mod)%mod;
}
int main()
{
pre();
ll n;
scanf("%lld",&n);
ll ans=0;
for(ll i=1;i<=n;i++)
{
if(i%2==0){ans=(ans+((i*Lucas(n-1,n-i/2)))%mod)%mod;if(ans<0)ans+=mod;}
else{ans=(ans+((Lucas(n-1,(i+1)/2-1)*i))%mod)%mod;if(ans<0)ans+=mod;}
}
printf("%lld\n",ans);
return 0;
}