《瞿葩的数字游戏》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 <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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值