《瞿葩的数字游戏》T3-三角圣地

题目描述:

题目分析:

观察发现越大的数排在中间位置对答案越有利,所以就可以贪心了
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过于大,观察模数较小,套用卢卡斯定理

题目链接:

Luogu 2675

Ac 代码:

// luogu-judger-enable-o2
#include 
#include 
#include 
#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(nreturn 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;
}

你可能感兴趣的:(题目分析,数论,卢卡斯定理)